Bellman-Ford算法解决单源最短路问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Bellman-Ford算法解决单源最短路问题相关的知识,希望对你有一定的参考价值。
#include<stdio.h> #include<stdlib.h> #include<stdbool.h> #define max 100 #define INF 999 struct edge{ int u; int v; int w; }e[max]; int vertex_num,edge_num; int d[max]; void relax(int u,int v,int w){ if(d[v]>d[u]+w)d[v]=d[u]+w; } bool Bellman_Ford(int s){ int i,j; //Part 1:init for(i=0;i<vertex_num;i++){ d[i]=INF; } d[s]=0; //Part 2:relax for(i=0;i<vertex_num;i++){ for(j=0;j<edge_num;j++){ relax(e[j].u,e[j].v,e[j].w); } } //Part 3:determine whether there exist a negative cirlce for(i=0;i<edge_num;i++){ if(d[e[i].u]>d[e[i].v]+e[i].w)return false; } return true; } int main(){ int i,j; FILE *fin = fopen ("dij.in", "r"); FILE *fout = fopen ("dij.out", "w"); char buf[10]; fgets(buf,10,fin); edge_num=atoi(buf); printf("edge_num:%d\n",edge_num); fgets(buf,10,fin); vertex_num=atoi(buf); printf("vertex_num:%d\n",vertex_num); for(i=0;i<edge_num;i++){ int start,end,weight;//start point,end point and the weight of edge fgets(buf,10,fin); sscanf(buf,"%d %d %d",&e[i].u,&e[i].v,&e[i].w); printf("start:%d end:%d weight:%d\n",e[i].u,e[i].v,e[i].w); } Bellman_Ford(0); for(i=0;i<vertex_num;i++){ printf("%d ",d[i]); } return 0; }
以上是关于Bellman-Ford算法解决单源最短路问题的主要内容,如果未能解决你的问题,请参考以下文章
单源最短路(bellman-ford算法+dijkstra算法)+任意两点最短路(floyd-warshall算法)
算法入门之完美单源最短路径:Bellman-Ford(贝尔曼-福特)算法
算法笔记-----单源最短路径之Bellman-Ford算法