#include<bits/stdc++.h>
using namespace std;
#define maxn 2000
#define ll long long
int e[maxn][maxn],dis[maxn],book[maxn];//邻接矩阵,路程储存,标记数组
int inf=99999999;
int n,m,s;//点的个数、有向边的个数、出发点编号
int start,to,val;//起终点,权值
int flag;//中转标记
int minn;//最小值
void init(int n)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i==j)
e[i][j]=0;//对角线归零
else
e[i][j]=inf;//其他地方存为正无穷
}
}
}
int main()
{
cin>>n>>m>>s;
init(n);//初始化
for(int i=1;i<=m;i++)//读入边
{
cin>>start>>to>>val;//起终点,权值
e[start][to]=val;//存图
}
for(int i=1;i<=n;i++)
{
dis[i]=e[s][i];
}
for(int i=1;i<=n;i++)
book[i]=0;
book[s]=1;
for(int i=1;i<=n-1;i++)
{
minn=inf;
for(int j=1;j<=n;j++)
{
if(book[j]==0&&dis[j]<minn)
{
minn=dis[j];
flag=j;
}
}
book[flag]=1;
for(int j=1;j<=n;j++)
{
if(e[flag][j]<inf)
{
if(dis[j]>dis[flag]+e[flag][j])
{
dis[j]=dis[flag]+e[flag][j];
}
}
}
}
for(int i=1;i<=n;i++)//输出结果
cout<<dis[i]<<" ";
cout<<endl;
return 0;
}
有组样例:
5 15 5
2 5 181
1 5 98
4 2 49
3 2 262
4 3 26
2 4 192
5 1 221
2 2 254
4 4 233
1 5 44
5 4 67
4 2 214
1 1 47
1 1 118
5 4 3
结果是:
221 52 29 3 0
我跑了一个
221 217 29 3 0
这是为什么???