題目描述ios
教學樓裏有不少教室,這些教室由雙向走廊鏈接。另外,還存在一些單向的祕密通道,經過它們能夠回到過去。如今有 N (1 ≤ N ≤ 500) 個教室,編號 1..N, M (1 ≤ M ≤ 2500) 條走廊,和 W (1 ≤ W ≤ 200) 條祕密通道。算法
DY在養貓之餘,仍是一個時間旅行愛好者。她但願從一間教室出發,通過一些走廊和祕密通道,回到她出發以前的某個時間。spa
共有F (1 ≤ F ≤ 5) 組數據。對每組數據,判斷DY是否有回到過去的可能性。不存在耗時超過10,000秒的走廊,且不存在能帶DY回到10,000秒以前的祕密通道。.net
輸入格式code
首先是一個整數F,表示接下來會有F組數據。orm
每組數據第1行:分別是三個空格隔開的整數:N,M和Wblog
第2行到M+1行:三個空格分開的數字(S,E,T)描述雙向走廊:從S到E須要耗費T秒。兩個教室可能由一個以上的路徑來鏈接。ci
第M +2到M+ W+1行:三個空格分開的數字(S,E,T)描述祕密通道:從S到E能夠使時間倒流T秒。get
輸出格式string
輸入樣例
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
題目連接
https://vjudge.net/problem/POJ-3259
題目的要求是回到她出發以前的某個時間,即從i再次走到i時,所用時間爲負數,Floyd算法算出每兩個教室的時間,再判斷一下從i再次走到i時的所用時間是否<0便可
AC代碼
#include <iostream> #include <cstdio> #include <fstream> #include <algorithm> #include <cmath> #include <deque> #include <vector> #include <queue> #include <string>1 #include <cstring> #include <map> #include <stack> #include <set> #include <sstream> #define IOS ios_base::sync_with_stdio(0); cin.tie(0) #define Mod 1000000007 #define eps 1e-6 #define ll long long #define INF 0x3f3f3f3f #define MEM(x,y) memset(x,y,sizeof(x)) #define Maxn 500+5 #define P pair<int,int> using namespace std; int N,M,W; int S,E,T; int d[Maxn][Maxn]; void init() { //i到j的距離爲INF MEM(d,INF); for(int i=1; i<=N; i++)//本身到本身的距離爲0 d[i][i]=0; } bool Floyd()//Floyd算法求最短路 { int i,j,k; for(k=1; k<=N; k++) { for(i=1; i<=N; i++) { for(j=1; j<=N; j++) { if(d[i][j]>d[i][k]+d[k][j])//(用min會超時) d[i][j]=d[i][k]+d[k][j]; } if(d[i][i]<0)//轉了一圈,回到這裏時,時間爲負數,則回到她出發以前的某個時間 return 1; } } return 0; } int main() { IOS; int F; cin>>F; while(F--) { cin>>N>>M>>W; init(); for(int i=0; i<M; i++) { int x,y,z; cin>>x>>y>>z; if(z<d[x][y]) d[x][y]=d[y][x]=z;//走廊雙向 } for(int i=0; i<W; i++) { int x,y,z; cin>>x>>y>>z; d[x][y]=-z;//祕密通道單=向 } if(Floyd()) cout<<"YES"<<endl; else cout<<"NO"<<endl; } return 0; }