根据无向图的边邻接矩阵求任意一点到其他所有点之间的最短路径。

根据无向图的边邻接矩阵求任意一点到其他所有点之间的最短路径。

直接上代码:

#include <iostream> 
#include <cmath>
using namespace std;
#define INFINITY 1000000000 //存储无向图中无边两点之间的距离
#define MAX 500 			//存储该无向图最多的点数为500
long arr[MAX][MAX]; 


void ShortestPath_DIJ(int n,int v0, int p[MAX][MAX], int D[MAX],long arr[MAX][MAX]) {  //计算v0到其他所有点之间的最短路径。
    int v, w, i, j, min;
    bool final[MAX];
    for(v=0; v<n; v++) {
        final[v]=false;
        D[v]=arr[v0][v];
        for(w=0; w<n; w++)
            p[v][w]=-1;
        if(D[v]<INFINITY) {
            p[v][0]=v0;
            p[v][1]=v;
        }
    }
 
    D[v0]=0;
    final[v0]=true;
 
    for(i=1; i<n; i++) {
        min=INFINITY;
        for(w=0; w<n; w++)
            if(!final[w] && D[w]<min) {
                v=w;
                min=D[w];
            }
        final[v]=true;
        for(w=0; w<n; w++) {
            if(!final[w] && min<INFINITY && arr[v][w]<INFINITY
             && (min+arr[v][w]<D[w])) {
                D[w]=min+arr[v][w];
                for(j=0; j<n; j++) {
                    p[w][j]=p[v][j];
                    if(p[w][j]==-1) {
                        p[w][j]=w;
                        break;
                    }
                }
 
            }
        }
    }
    
    for(int i=0;i<n;i++)                             //输出v0到其他所有点之间的最短路径
    {
    	if(i!=v0)
    	{
    		cout<<v0<<"------>"<<i<<": "<<D[i]<<endl;	
		}
		else
		{
			continue;
		}
    	
	}
}

int main()
{
	
	int n,k;
	while(true)
	{
		cout<<"请输入点数和边数:"; 
		cin>>n>>k;
		for(int m=0;m<n;m++)
		{
			for(int r=0;r<n;r++)
			{
				if(m==r)
				{
					arr[m][r]=0;
				}
				else
				{
					arr[m][r]=INFINITY;	
				}

			}
		}
		cout<<"请输入每条边的邻接点及所在边的距离:"<<endl; 
		for(int m=0;m<k;m++)
		{
			int i,j,d;
			cin>>i>>j>>d;
			arr[i][j]=d;
			arr[j][i]=arr[i][j];
		}
		int p[MAX][MAX];
		int D[MAX];
		int v0;
		cout<<"请输入起始点:";
		cin>>v0;
		cout<<v0<<"点到其他各个点之间的最短距离为:"<<endl ;
		ShortestPath_DIJ(n,v0,p,D,arr);
		
	}
	return 0;
}

  运行结果如下:

提示:如果想要求任意两点之间的最短路径,可以修改  ShortestPath_DIJ 函数的参数,增加一个目标点参数,在输出时只输出对应的最短距离即可。

原文地址:https://www.cnblogs.com/yjd_hycf_space/p/7090660.html