下面附代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1010;
int n,m,s;
int d[N][N];
int x,y;
int main()
{
memset(d,0x3f3f3f3f,sizeof(d));
cin>>n>>m>>s;
for(int i=1;i<=m;i++)
{
cin>>x>>y>>d[x][y];
d[y][x]=d[x][y];
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(i==j)d[i][j]=0,d[j][i]=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
for(int k=1;k<=n;k++)
if(d[i][k]+d[k][j]<d[i][j])
{
d[i][j]=d[i][k]+d[k][j];
d[j][i]=d[i][k]+d[k][j];
}
for(int i=1;i<=n;i++)cout<<d[s][i]<<" ";
return 0;
}
#include<iostream>
using namespace std;
const int maxn=101, inf=99999;
int v[maxn],a[maxn][maxn],d[maxn],path[maxn];
int n,m,start;
void init()
{
cin>>n>>m>>start;
int x,y,w;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(i==j) a[i][j]=0;
else a[i][j]=inf;
}
for(int i=1;i<=m;i++)
{
cin>>x>>y>>w;
a[x][y]=w;
a[y][x]=w;
}
}
void dijkstra(int s)
{
for (int i=1;i<=n;i++) { d[i]=inf; v[i]=false; }
d[s]=0;
for (int i=1;i<=n;i++)
{
int mind=inf;
int k; //用来记录准备放入集合1的点
for (int j=1;j<=n;j++) //查找集合2中d[]最小的点
if ( (!v[j]) &&(d[j]<mind) )
{
mind=d[j];
k=j;
}
if (mind==inf) break; //更新结点求完了
v[k]=true; // 加入集合1
for (int j=1;j<=n;j++) //修改集合2中的d[j]
if ((!v[j]) && (d[k]+a[k][j]<d[j]))
{
d[j]=d[k]+a[k][j];
path[j]=k;
}
}
}
void dfs(int i)
{
if(i!=start) dfs(path[i]);
//cout<<i<<' ';
}
void write()
{
for (int i=1;i<=n;i++)
//if(i!=start)
{
dfs(i);
cout<<d[i]<<" ";
}
}
int main()
{
init();
dijkstra(start);
write();
return 0;
}