Bellman-ford算法 实现源点最短路径 允许路径中有负权值

来源:互联网 发布:程序员 显示器 知乎 编辑:程序博客网 时间:2024/06/15 20:51
#include<stdio.h>#include<string.h>#define INF 1000#define MAXN 20int 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;}

0 0
原创粉丝点击