#include<stdio.h>
#include<string.h>
#define INF 1000
#define MAXN 20
int n,m;
int Edge[MAXN][MAXN];
int S[MAXN]; //表示是否找到最短路径
int dist[MAXN]; //表示当前最短路径的距离
int path[MAXN];//最短路径的上一个顶点
void Bellman(int v0)
{
int i,j,k,u;
for(i=0;i<n;i++)
{
dist[i]=Edge[v0][i];
if(i!=v0 && dist[i]<INF)
path[i]=v0;
else
path[i]=-1;
}
for(k=2;k<n;k++)
{
for(u=0;u<n;u++)
{
if(u!=0)
{
for(j=0;j<n;j++)
if(Edge[j][u]<INF && dist[j]+Edge[j][u]<dist[u])
{
dist[u]=dist[j]+Edge[j][u];
path[u]=j;
}
}
}
}
}
int main()
{
int i,j,k;
int u,v,w;
int shortest[MAXN];
scanf("%d %d",&n,&m);
memset(Edge,0,sizeof(Edge));
for(j=0;j<m;j++)
{
scanf("%d%d%d",&u,&v,&w);
Edge[u][v]=w;
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
if(i==j)
Edge[i][j]=0;
else if(Edge[i][j]==0)
Edge[i][j]=INF;
}
Bellman(0);
for(i=1;i<n;i++)
{
printf("%d\t",dist[i]);
memset(shortest,0,sizeof(shortest));
k=0;
shortest[k]=i;
while(path[shortest[k]]!=0)
{
k++;
shortest[k]=path[shortest[k-1]];
}
k++;
shortest[k]=0;
for(j=k;j>0;j--)
printf("%d->",shortest[j]);
printf("%d\n",shortest[0]);
}
system("PAUSE");
return 0;
}
Bellman-ford算法 实现源点最短路径 允许路径中有负权值
原文作者:Bellman - ford算法
原文地址: https://blog.csdn.net/lijing805326040/article/details/25117919
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://blog.csdn.net/lijing805326040/article/details/25117919
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。