• 最短路径+路径输出


    实验内容与要求

    根据输入的图形,输入起点和终点,求出最短路径和最短路径的
    长度。

    具体步骤

    1. 编写一段代码,接收键盘的输入定点的数量,并以输入的整数对作为边来建立图形的邻接矩阵(无向权重图)。
      例如 : 5,6,12
      表示定点 5 和定点 6 间有边,边的权重为 12。
    2. 打印出邻接矩阵。
    3. 输入起点和终点。
    4. 打印最短路径和最短路径的长度
    5. 样例:输入:
      1 3 5
      1 4 30
      2 1 2
      3 2 15
      3 6 7
      5 4 4
      6 4 10
      6 5 18
      打印出1,5两点之间的距离及最短路径

    代码

    /*************************************************************************
        > File Name: dijkstra.cpp
        > Author: WZY
        > School: HPU 
        > Created Time: 2018年11月15日 11:39:01
     ************************************************************************/
    
    #include <bits/stdc++.h>
    #define ms(a,b) memset(a,b,sizeof(a))
    #define INF 0x7f7f7f7f
    const int maxn=1e3+10;
    using namespace std;
    int edge[maxn][maxn];
    int dis[maxn];
    int vis[maxn];
    int n,m;
    int way[maxn];
    int tol;
    int pri[maxn];
    inline void dijkstra(int start)
    {
    	ms(vis,0);
    	ms(dis,INF);
    	vis[start]=1;dis[start]=0;
    	int ans=INF,res;
    	for(int i=1;i<n;i++)
    	{
    		for(int j=1;j<=n;j++)
    		{
    			if(edge[start][j]!=INF&&!vis[j])
    			{
    				if(dis[j]>dis[start]+edge[start][j])
    				{
    					way[j]=start;
    					dis[j]=dis[start]+edge[start][j];
    				}
    				if(ans>dis[j]&&!vis[j])
    				{
    					ans=dis[j];
    					res=j;
    				}
    			}
    		}
    		vis[res]=1;
    		start=res;
    		ans=INF;
    	}
    }
    int main(int argc, char const *argv[])
    {
    	while(cout<<"请输入点的个数和边的个数:",cin>>n>>m&&n&&m)
    	{
    		cout<<"请输入相连的两点即两点间的权值(用空格隔开):"<<endl;
    		ms(pri,0);
    		tol=0;
    		ms(edge,INF);
    		int u,v,w;
    		for(int i=0;i<m;i++)
    		{
    			cin>>u>>v>>w;
    			edge[u][v]=edge[v][u]=w;
    		}
    		cout<<"输出邻接矩阵为:"<<endl;
    		for(int i=1;i<=n;i++)
    		{
    			for(int j=1;j<=n;j++)
    			{
    				if(i==j)
    					printf("0	");
    				else if(edge[i][j]==INF)
    					printf("INF	");
    				else
    					printf("%d	",edge[i][j]);
    			}
    			printf("
    ");
    		}
    		cout<<"请输入起点和终点:";
    		int start,end;
    		cin>>start>>end;
    		dijkstra(start);
    		cout<<start<<"和"<<end<<"两点间的最短距离为:"<<dis[end]<<endl;
    		cout<<"最短路的路径为:";
    		int r=end;
    		int s=start;
    		int _=0;
    		pri[_++]=end;
    		while(r!=s)
    		{
    			pri[_++]=way[r];
    			r=way[r];	
    		}
    		for(int i=_-1;i>=0;i--)
    		{
    			if(i!=_-1)
    				cout<<"->";
    			cout<<pri[i];
    		}
    		cout<<endl;
    	}
    	return 0;
    }
    
    
    
  • 相关阅读:
    【docker】更换挂载目录
    【设计】交互走查表
    MySQL常用字符串函数
    VIM_manual
    MySQL操作符
    基础SELECT实例
    MySQL字符集及校对规则的理解
    Linux命令之tar-rsync
    Linux-PATH_环境变量
    MySQL常用数据类型
  • 原文地址:https://www.cnblogs.com/Friends-A/p/10324328.html
Copyright © 2020-2023  润新知