暑假训练专题三 bellman-ford 求两点之间的最短路径
2012-07-04 10:24
357 查看
bellman-ford 求两点之间的最短路径 点数为v,边数为e,点的距离设为dis[i];1.开始对所有的点初始为最大值,所求的源点的值设为0;2.开个结构体数组(邻接矩阵)来存储所有的边的两点和权值(from,to,value)3.循环1- v 实际循环1到 v-1次以内 是正确的结果,表示没有负环,如果循环了v次,则表示存在负环。(判断的是dis[to]>dis[from]+value{dis[to]=dis[from]+value;})4.最后输出个点的结果 。方案一:如果要求b点到其余各点的距离,就将b点的距离设为0;并且可以求出来是否存在负环。方案二: 如果初始化所有的的为inf 仅能求出是否有负环这道题采用的是方案二:下面是一道经典例题:http://poj.org/problem?id=3259wormholes得出正确的结果:postcode:
#include<stdio.h> const int max=10000000; typedef structnode { int from; int to; int value; } point; pointp[5500]; int dis[510]; void init(); int judge(); int t,n,m,w,i,j,x,y,z,result; int main() { scanf("%d",&t); while(t--) { scanf("%d %d %d",&n,&m,&w); init(); for(i=1;i<=m;i++) { scanf("%d %d %d",&x,&y,&z); p[i].from=p[i+m].to=x; p[i].to=p[i+m].from=y; p[i].value=p[i+m].value=z; } for(i=2*m+1;i<=2*m+w;i++) { scanf("%d %d %d",&x,&y,&z); p[i].from=x; p[i].to=y; p[i].value=-z; } result=judge(); if(result==0)printf("YES\n"); else printf("NO\n"); } } void init() {int i; for(i=1;i<=n;i++) { dis[i]=max; } } int judge() { int flag; for(i=1;i<=n;i++) { flag=0; for(j=1;j<=2*m+w;j++) { if(dis[p[j].to]>dis[p[j].from]+p[j].value){ dis[p[j].to]=dis[p[j].from]+p[j].value; flag=1; } } if(flag==1&&i==n)return 0; if(flag==0)return 1; } }
方案一的代码:
bool Bellman(int s , int n , int m){ int u , v , w , i , j , flag; for(i = 1 ; i <= n ; i ++)dis[i] = INF; dis[s] = 0; for(i = 1 ; i <= n ; i ++){ for(j = flag = 0 ; j < m ; j ++){ u = edge[j].from , v = edge[j].to , w = edge[j].value; if(dis[v] > dis[u] + w){ dis[v] = dis[u] + w; flag = 1; } } if(!flag)break; if(i == n && flag)return false; } return true; }
相关文章推荐
- 最短路径算法专题3----Bellman-Ford
- 【最短路径入门专题1】K - Wormholes POJ3259 【SPFA】【Bellman-Ford】
- 最短路径算法比较(Dijkstra、Bellman-Ford、SPFA)及实现(Java)
- 单源最短路径:Dijkstra 算法 Bellman_Ford 算法 SPFA 算法
- 【最短路径-Floyd/Bellman_Ford】hdu 1217 Arbitrage
- 单源最短路径 : Bellman-Ford 算法
- POJ 1860 Currency Exchange Bellman-Ford算法求单源最短路径并判断是否有正权回路
- Poj 1860 Currency Exchange(Bellman-Ford,SPFA解单源最短路径问题)
- POJ3259 Wormholes (Bellman-Ford最短路径算法)
- [图的最短路径算法]Dijkstra, Bellman-Ford, Floyd-Warshall
- Bellman-ford算法求解单源点最短路径初始版本
- 最短路径算法—Bellman-Ford(贝尔曼-福特)算法分析与实现(C/C++)
- Bellman-Ford算法 单源最短路径(o(nm))
- 四、最短路径之Bellman-Ford与SPFA
- 第七章 图(最短路径算法:dijkstra,bellman-ford,floyd)
- POJ 1860 Currency Exchange (最短路径.Bellman-Ford)
- Python-通过Dijkstra计算两点之间的最短路径
- 求单源最短路径的算法(Bellman-Ford)
- 单源最短路径算法 Bellman-Ford && SPFA 及 最短路算法统一归纳
- java实现图的最短路径(SP)的贝尔曼福特(Bellman-Ford)算法