首页 > 代码库 > poj3259(Wormholes)
poj3259(Wormholes)
题目大意:
一个农夫在农场发现了许多奇怪的虫洞,这些虫洞是单向的,已知N个农场,M条正常的路径,W条虫洞,虫洞可以使时间倒流,农主通过正常的路径花费一定的时间,这个路径是双向的, 通过虫洞的路径可以使时间倒流,农主是狂热的旅行者,他的目的是通过正常路径和虫洞,能否回到最初的起点的时刻!
解题思路:
bellman_ford算法,看是否有负权回路,有负权回路说明农主到达最初出发的农场“1”的权值小于0,也就意味着农主能通过虫洞的时光倒流回到最初出发农场的那个时刻,注意单向边和双向边,和数组的大小。
代码:
1 #include <algorithm> 2 #include <iostream> 3 #include <sstream> 4 #include <cstdlib> 5 #include <cstring> 6 #include <cstdio> 7 #include <string> 8 #include <bitset> 9 #include <vector> 10 #include <queue> 11 #include <stack> 12 #include <cmath> 13 #include <list> 14 #include <map> 15 #include <set> 16 using namespace std; 17 /***************************************/ 18 #define ll long long 19 #define int64 __int64 20 /***************************************/ 21 const int INF = 0x7f7f7f7f; 22 const double eps = 1e-8; 23 const double PIE=acos(-1.0); 24 const int d1x[]= {0,-1,0,1}; 25 const int d1y[]= {-1,0,1,0}; 26 const int d2x[]= {0,-1,0,1}; 27 const int d2y[]= {1,0,-1,0}; 28 const int fx[]= {-1,-1,-1,0,0,1,1,1}; 29 const int fy[]= {-1,0,1,-1,1,-1,0,1}; 30 /***************************************/ 31 void openfile() 32 { 33 freopen("data.in","rb",stdin); 34 freopen("data.out","wb",stdout); 35 } 36 /**********************华丽丽的分割线,以上为模板部分*****************/ 37 struct no 38 { 39 int u,v; 40 int cost; 41 } node[6000]; 42 int dis[550]; 43 bool bellman_ford(int n,int edgenum) 44 { 45 int i,j; 46 for(i=1; i<=n; i++) 47 dis[i]=INF; 48 dis[1]=0; 49 for(i=1; i<=n-1; i++) 50 for(j=0; j<edgenum; j++) 51 if (dis[node[j].v]>dis[node[j].u]+node[j].cost) 52 dis[node[j].v]=dis[node[j].u]+node[j].cost; 53 bool flag=0; 54 for(j=0; j<edgenum; j++) 55 if (dis[node[j].v]>dis[node[j].u]+node[j].cost) 56 flag=1; 57 return flag; 58 } 59 int main() 60 { 61 int cas; 62 scanf("%d",&cas); 63 while(cas--) 64 { 65 int n,m,w; 66 int i,j; 67 scanf("%d%d%d",&n,&m,&w); 68 int x,y,val; 69 int d=0; 70 for(i=0; i<m; i++) 71 { 72 scanf("%d%d%d",&x,&y,&val); 73 node[d].u=x; 74 node[d].v=y; 75 node[d].cost=val; 76 d++; 77 node[d].u=y; 78 node[d].v=x; 79 node[d].cost=val; 80 d++; 81 } 82 for(i=m; i<m+w; i++) 83 { 84 scanf("%d%d%d",&x,&y,&val); 85 node[d].u=x; 86 node[d].v=y; 87 node[d].cost=-val; 88 d++; 89 } 90 if (bellman_ford(n,d)) 91 printf("YES\n"); 92 else 93 printf("NO\n"); 94 } 95 return 0; 96 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。