【POJ - 3259】Wormholes(最短路 Floyd算法)

Wormholes

題目描述ios

教學樓裏有不少教室,這些教室由雙向走廊鏈接。另外,還存在一些單向的祕密通道,經過它們能夠回到過去。如今有 N (1 ≤ N ≤ 500) 個教室,編號 1..NM (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

F行,每行對應一組數據。 每組數據輸出單獨的一行,」 YES」表示能知足要求,」NO」表示不能知足要求。

輸入樣例

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;
}
相關文章
相關標籤/搜索