8.7 K - Wormholes

xiaoxiao2021-02-28  82

                                     K - Wormholes

While exploring his many farms, Farmer John has discovered a number of amazing wormholes. A wormhole is very peculiar because it is a one-way path that delivers you to its destination at a time that is BEFORE you entered the wormhole! Each of FJ's farms comprises N (1 ≤ N ≤ 500) fields conveniently numbered 1..N, M (1 ≤ M≤ 2500) paths, and W (1 ≤ W ≤ 200) wormholes.

As FJ is an avid time-traveling fan, he wants to do the following: start at some field, travel through some paths and wormholes, and return to the starting field a time before his initial departure. Perhaps he will be able to meet himself :) .

To help FJ find out whether this is possible or not, he will supply you with complete maps to F (1 ≤ F ≤ 5) of his farms. No paths will take longer than 10,000 seconds to travel and no wormhole can bring FJ back in time by more than 10,000 seconds.

Input Line 1: A single integer,  F.  F farm descriptions follow.  Line 1 of each farm: Three space-separated integers respectively:  N,  M, and  W  Lines 2..  M+1 of each farm: Three space-separated numbers (  S,  E,  T) that describe, respectively: a bidirectional path between  S and  E that requires  T seconds to traverse. Two fields might be connected by more than one path.  Lines  M+2..  M+  W+1 of each farm: Three space-separated numbers (  S,  E,  T) that describe, respectively: A one way path from  S to  E that also moves the traveler back T seconds. Output Lines 1..  F: For each farm, output "YES" if FJ can achieve his goal, otherwise output "NO" (do not include the quotes). Sample Input 2 3 3 1 1 2 2 1 3 4 2 3 1 3 1 3 3 2 1 1 2 3 2 3 4 3 1 8 Sample Output NO YES Hint For farm 1, FJ cannot travel back in time.  For farm 2, FJ could travel back in time by the cycle 1->2->3->1, arriving back at his starting location 1 second before he leaves. He could start from anywhere on the cycle to accomplish this.

Bellman_Ford算法模板题,题意为一个人发现了许多虫洞,他可以从一个虫洞穿到另一个虫洞,跳跃到几分钟后,问他能否通过虫洞返回到他出发之前。输入N,M,W,有N个虫洞,M+W条路径,前M条为双向路径,后W条为单向。

#include<stdio.h> #include<string.h> int d[11000],u[11000],v[11000],w[11000],x,s,m,n; int main() { int i,j,k; int max=1e9,c,f,t; int t1,t2,t3; scanf("%d",&t); while(t--) { x=1; scanf("%d%d%d",&n,&m,&s); for(i=1;i<=m;i++) { scanf("%d%d%d",&t1,&t2,&t3); u[x]=t1;v[x]=t2;w[x++]=t3;//前m条路径双向储存 u[x]=t2;v[x]=t1;w[x++]=t3; } for(i=1;i<=s;i++) { scanf("%d%d%d",&t1,&t2,&t3); u[x]=t1;v[x]=t2;w[x++]=0-t3;//后s条单向储存 } memset(d,0,sizeof(d)); int c; for(k=1;k<=n;k++) { c=0; for(i=1;i<=x;i++) { if(d[v[i]]>d[u[i]]+w[i]) { d[v[i]]=d[u[i]]+w[i]; c=1; } } if(!c) break; } f=0; for(i=1;i<=x;i++)//判断是否含有负权回路 { if(d[v[i]]>d[u[i]]+w[i]) { f=1; } } if(f==1) { printf("YES\n"); } else { printf("NO\n"); } } return 0; }

 
转载请注明原文地址: https://www.6miu.com/read-72555.html

最新回复(0)