别问我为什么又折腾这玩意儿,心累。
今天的收获在于用递归的方式实现了路径p[]的输出。
#include <bits/stdc++.h>
using namespace std;
#define MAXSIZE 101
#define INF 1000000
int d[MAXSIZE];
int v[MAXSIZE];
int m[MAXSIZE][MAXSIZE];
int p[MAXSIZE];
int n,e;
void Init()
{
int i;
memset(v,0,sizeof(v));
for(i=1;i<=n;i++)
d[i]=p[i]=INF;
}
void Input()
{
int i,j,a,b,t;
cin>>n>>e;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
m[i][j]=INF;
for(i=1;i<=e;i++)
{
cin>>a>>b>>t;
m[a][b]=m[b][a]=t;
}
}
void Dijkstra(int s)
{
int i,j,k,mi;
d[s]=0;
for(j=0;j<n;j++)
{
mi=INF;
for(i=1;i<=n;i++)
if(!v[i]&&d[i]<mi)
{
mi=d[i];
k=i;
}
v[k]=1;
for(i=1;i<=n;i++)
if(!v[i]&&d[k]+m[k][i]<d[i])
{
d[i]=d[k]+m[k][i];
p[i]=k;
}
}
}
void print_path(int s,int en)//根据p[]递归输出路径
{
if(p[en]!=s)//只要不为s,就递归
print_path(s,p[en]);
cout<<"->"<<en;//总归是要输出的
}
int main()
{
int s,i;
Input();
while(cin>>s)
{
Init();
Dijkstra(s);
for(i=1;i<=n;i++)
if(i!=s)
{
cout<<s;
print_path(s,i);
cout<<" "<<d[i]<<endl;
}
}
}