根据无向图的边邻接矩阵求任意一点到其他所有点之间的最短路径。
直接上代码:
#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 函数的参数,增加一个目标点参数,在输出时只输出对应的最短距离即可。