//Bellman-Ford算法
#include<stdio.h>
#define N 1010
#define MAX 10000000
typedef struct edge{
int u,v;
int cost;
}Edge;
Edge edge [N];
int dis[N],pre[N];
int nodenum,edgenum,original;
int Bellman_Ford();
void print_path(int u);
int main()
{
scanf("%d%d%d",&nodenum,&edgenum,&original);
pre[original]=original;
int i;
for(i=1;i<=edgenum;i++)
{
scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].cost);
}
if(Bellman_Ford()==1)
for(i=1;i<=nodenum;i++)
{
printf("%d\n",dis[i]);
printf("Path:");
print_path(i); //当不连通时,会输出dis[i]的初始值1000000
}
return 0;
}
int Bellman_Ford()
{
int i,j;
for(i=1;i<=nodenum;i++)
dis[i] = (i==original)?0:MAX;
for(i=1;i<=nodenum-1;i++)
for(j=1;j<=edgenum;j++)
if(dis[edge[j].v] > dis[edge[j].u]+edge[j].cost)
{
dis[edge[j].v] = dis[edge[j].u]+edge[j].cost;
pre[edge[j].v] = edge[j].u;
}
//判断是否含有负权回路
int flag=1;
for(i=1;i<=edgenum;i++)
if(dis[edge[i].v] > dis[edge[i].u] + edge[i].cost)
{
flag=0;
printf("WRONG");
break;
}
return flag;
}
void print_path(int u) //反向打印最短路径,由 v 到 u
{
while(u!=pre[u])
{
printf("%d ",u);
u=pre[u];
}
if(u==pre[u])
printf("%d\n",u);
}
Bellman_Ford算法
最新推荐文章于 2024-05-30 23:25:24 发布