//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算法
最新推荐文章于 2025-12-22 09:43:16 发布
本文介绍了一种用于解决带负权边的最短路径问题的Bellman-Ford算法实现。该算法通过逐步松弛的方式找到从起点到所有其他点的最短路径,并能够检测是否存在负权回路。
217

被折叠的 条评论
为什么被折叠?



