#include <iostream>
using namespace std;
const int maxn=100;
const int maxint=99999;
typedef struct Edge
{
int u,v; // 起点,重点
int wt; // 边的权值
}Edge;
Edge edge[maxn]; // 保存边的值
int dist[maxn]; // 结点到源点最小距离
int noden,edgen,se;// 结点数,边数,源点
void init()
{
scanf("%d%d%d",&noden,&edgen,&se);
for(int i=1;i<=noden;++i)
dist[i]=maxint;
dist[se]=0;
for(int i=1;i<=edgen;++i)
{
scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].wt);
if(edge[i].u==se)//注意这里设置初始情况
dist[edge[i].v]=edge[i].wt;
}
}
// 松弛操作
void relax(int u,int v,int wt)
{
if(dist[v]>dist[u]+wt)
dist[v]=dist[u]+wt;
}
bool Bellman_Ford()
{
for(int i=1;i<=noden-1;++i)
for(int j=1;j<=edgen;++j)
relax(edge[j].u,edge[j].v,edge[j].wt);
bool flag=1;
// 判断是否有负环路
for(int i=1;i<=edgen;++i)
{
if(dist[edge[i].v]>dist[edge[i].u]+edge[i].wt)
{
flag=0;
break;
}
return flag;
}
}
int main()
{
//freopen("input.txt", "r", stdin);
init();
if(Bellman_Ford())
for(int i=1;i<=noden;i++)
printf("%d ",dist[i]);
return 0;
}
Bellman-Ford求最短路径
最新推荐文章于 2020-08-05 08:49:22 发布