代码如下:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <stack>
using namespace std;
const int maxn=1005;
const int INF=0x3f3f3f3f;
int edge[maxn][maxn];
int d[maxn]; //表示从1到n的最短路径长度
int vis[maxn]; //表示是否被压入集合
int path[maxn]; //表示此点的上一个节点
int n,m;
void init ()
{
memset (vis,0,sizeof(vis));
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
if(i==j)
edge[i][j]=0;
else
edge[i][j]=INF;
memset (path,-1,sizeof(path));
}
void Dijkstra (int x) //从x到别的点的最短距离
{
for (int i=1;i<=n;i++)
d[i]=edge[x][i];
while (1)
{
int u=-1;
int maxx=INF;
for (int i=1;i<=n;i++)
if(!vis[i]&&d[i]<maxx)
{
maxx=d[i];
u=i;
}
if(u==-1)
break;
vis[u]=1;
for (int i=1;i<=n;i++)
if(!vis[i]&&d[i]>d[u]+edge[u][i])
{
d[i]=d[u]+edge[u][i];
path[i]=u;
}
}
}
void findpath(int start,int endd) //打印出最短路
{
if(start==endd)
return;
stack<int>s;
int fin=endd;
printf("%d->",start);
while (path[endd]!=-1)
{
s.push(path[endd]);
endd=path[endd];
}
while (!s.empty())
{
printf("%d->",s.top());
s.pop();
}
printf("%d\n",fin);
}
int main()
{
int x;
scanf("%d%d%d",&n,&m,&x);
init();
for (int i=0;i<m;i++)
{
int x,y,len;
scanf("%d%d%d",&x,&y,&len);
edge[x][y]=edge[y][x]=len;
}
Dijkstra(x);
for (int i=1;i<=n;i++)
{
if(i!=x)
{
printf("从%d到%d最短路径为\n",x,i);
findpath(x,i);
printf("从%d到%d的最短路径长度为:\n",x,i);
printf("%d\n",d[i]);
}
}
return 0;
}