NC25101. [USACO 2006 Dec G]Wormholes
描述
输入描述
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.
输出描述
Lines 1..F: For each farm, output "YES" if FJ can achieve his goal, otherwise output "NO" (do not include the quotes).
示例1
输入:
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
输出:
NO YES
说明:
For farm 1, FJ cannot travel back in time.C++(clang++11) 解法, 执行用时: 493ms, 内存消耗: 2376K, 提交时间: 2021-02-08 19:40:57
#include<bits/stdc++.h> #define ll long long using namespace std; const ll inf=1e17; ll a[510][510]; int n,m,w; int main() { int q; scanf("%d",&q); while(q--) { scanf("%d%d%d",&n,&m,&w); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { a[i][j]=inf; } a[i][i]=0; } for(int i=0;i<m;i++) { int x,y; ll z; scanf("%d%d%lld",&x,&y,&z); a[x][y]=min(a[x][y],z); a[y][x]=min(a[y][x],z); } for(int i=0;i<w;i++) { int x,y; ll z; scanf("%d%d%lld",&x,&y,&z); z=-z; a[x][y]=min(a[x][y],z); } for(int k=1;k<=n;k++) { for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { a[i][j]=min(a[i][j],a[i][k]+a[k][j]); } } } int k=0; for(int i=1;i<=n;i++) { if(a[i][i]<0) { k=1; break; } } if(k) printf("YES\n"); else printf("NO\n"); } return 0; }