时间限制: 1000 ms 内存限制: 65536 KB
提交数: 505 通过数: 281
【题目描述】
原题来自:USACO 2006 Dec. Gold,原文见 POJ 3259

John 在他的农场中闲逛时发现了许多虫洞。虫洞可以看作一条十分奇特的有向边,并可以使你返回到过去的一个时刻(相对你进入虫洞之前)。John 的每个农场有 M 条小路(无向边)连接着 N(从 1 到 N 标号)块地,并有 W 个虫洞。

现在 John 想借助这些虫洞来回到过去(在出发时刻之前回到出发点),请你告诉他能办到吗。 John 将向你提供 F 个农场的地图。没有小路会耗费你超过 104秒的时间,当然也没有虫洞回帮你回到超过 104 秒以前。

【输入】
第一行一个整数 F,表示农场个数;

对于每个农场:

第一行,三个整数 N,M,W;

接下来 M 行,每行三个数 S,E,T,表示在标号为 S 的地与标号为 E 的地中间有一条用时 T 秒的小路;

接下来 W 行,每行三个数 S,E,T,表示在标号为 S 的地与标号为 E 的地中间有一条可以使 John 到达 T 秒前的虫洞。

【输出】
输出共 F 行,如果 John 能在第 i 个农场实现他的目标,就在第 i 行输出 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
【提示】
数据范围:

对于全部数据,1≤F≤5,1≤N≤500,1≤M≤2500,1≤W≤200,1≤S,E≤N,∣T∣≤104​ 。


#include <iostream>
#include <cstring>
#include <deque>
#define N 512
#define ll long long
using namespace std;

ll GN;
ll dis[N];
ll ved[N];
ll cnt[N];


ll n;

inline void init()
{
    
    memset(G,0x3f,sizeof(G));
    memset(dis,0x3f,sizeof(dis));
    memset(ved,0,sizeof(ved));
    memset(cnt,0,sizeof(cnt));
    
    ll m,w;
    cin>>n>>m>>w;
    
    for(ll i=1;i<=m;i++)
    {
        ll S,E,T;cin>>S>>E>>T;
        GE=GS=min(T,GS);
    }
    for(ll i=1;i<=w;i++)
    {
        ll S,E,T;cin>>S>>E>>T;
        GS=min(-T,GS);
    }
    
}

inline void SPFA()
{
    deque <ll> Q;
    Q.push_back(1);
    dis[1]=0;
    cnt[1]++;
    ved[1]=true;
    while(!Q.empty())
    {
        ll k=Q.front();
        Q.pop_front();
        ved[k]=false;
        cnt[k]++;
        
        for(ll i=1;i<=n;i++)
            if(dis[i]>dis[k]+Gk)
            {
                dis[i]=dis[k]+Gk;
                if(!ved[i])
                {
                    if(cnt[i]>n)
                    {
                        cout<<"YES"<<endl;
                        return ;
                    }
                    if(!Q.empty() && dis[i]>dis[Q.front()])
                        Q.push_back(i);
                    else
                        Q.push_front(i);
                    ved[i]=true;
                }
            }
    }
    cout<<"NO"<<endl;
}


int main()
{
    cin.tie(0);
    ll g;cin>>g;
    while(g--)
    {
        init();
        SPFA();
    }
}
Last modification:February 7th, 2021 at 09:20 pm