poj3259 Bellman-Ford
2014-07-19 10:48
183 查看
还是一个求最短路径问题,不过不是求最短而是判断是否存在负权回路。
判断是否存在负权回路,当然要用Bellman-Ford算法了。
水题,不多说了,代码如下:
判断是否存在负权回路,当然要用Bellman-Ford算法了。
水题,不多说了,代码如下:
#include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<algorithm> #define MAX 555 #define inf 999999 using namespace std; struct Edge { int u,v; int t; Edge(int U=0,int V=0,int T=0) { u=U;v=V;t=T; } }; Edge edge[10*MAX]; int dis[MAX]; int F,N,M,W; bool Bellman_Ford(int nodenum,int edgenum,int original) { for(int i = 1; i <= nodenum; ++i) //初始化 dis[i] = (i == original ? 0 : inf); for(int i = 1; i <= nodenum - 1; ++i) for(int j = 1; j <= edgenum; ++j) if(dis[edge[j].v] > dis[edge[j].u] + edge[j].t) //松弛(顺序一定不能反~) { dis[edge[j].v] = dis[edge[j].u] + edge[j].t; } bool flag = 1; //判断是否含有负权回路 for(int i = 1; i <= edgenum; ++i) if(dis[edge[i].v] > dis[edge[i].u] + edge[i].t) { flag = 0; break; } return flag; } void input() { int i,j=1,s,e,t; scanf("%d",&F); while(F) { j=1; scanf("%d%d%d",&N,&M,&W); for(i=1;i<=M;i++) { scanf("%d%d%d",&s,&e,&t); edge[j++]=Edge(s,e,t); edge[j++]=Edge(e,s,t); } for(i=1;i<=W;i++) { scanf("%d%d%d",&s,&e,&t); edge[j++]=Edge(s,e,-1*t); } if(Bellman_Ford(N,2*M+W,1)) printf("NO\n"); else printf("YES\n"); F--; } } int main() { input(); return 0; }
相关文章推荐
- poj3259(Bellman_ford)
- POJ3259 Wormholes (Bellman-Ford最短路径算法)
- POJ3259——Wormholes(Bellman-Ford+SPFA)
- POJ3259 Wormholes (Bellman-Ford最短路径算法)
- [水]poj3259 (Bellman-ford)
- POJ3259 Wormholes 解题报告--bellman_ford
- POJ3259 农场与虫洞 图论(Bellman-Ford求负环)
- POJ3259 Wormholes Bellman-Ford C语言
- POJ3259《Wormholes》方法:Bellman-ford
- POJ3259 Wormholes (Bellman-Ford最短路径算法)
- poj3259 Wormholes 图的负权回路判定,Bellman_Ford
- poj3259 bellman—ford
- POJ3259(Wormholes)(Bellman-Ford判断负权图 )
- 虫洞_poj3259_bellman_ford
- POJ3259 Wormholes(Bellman-ford 负环)
- poj3259_bellman-ford
- 【最短路】poj3259-Wormholes(Bellman-Ford 最短路)
- poj3259 Bellman_ford
- POJ3259 Wormholes SPFA 或者 bellman_ford
- poj3259 bellman_ford 算法 判环 最短路