gym 101987 J Starwars(bfs)

題意

給定一張1e3的有向圖,每條路徑都有一個編碼 (編碼範圍爲20),並給出一些人類點,和目的點,求是否存在從非人類點出發到目的點的路徑編號序與人類店出發到目標點的路徑編碼序一樣。存在輸出YES,否則NO

題解

倒着去考慮,假若存在一條一樣的路那麼從後往前回溯路徑發現兩條路徑的起點都爲目標點,終點一個爲人類點,一個爲非人類點,之後我們考慮兩個狀態代表人類和非人類,他們的出發點都爲目標點,之後他們兩兩選擇的路徑需要保證路徑編號一樣,因此我們只要將所有可行的出發點塞入隊列,跑bfs,最後check是否存在一個非人類點和一個人類點這樣的狀態是可達狀態,若存在則YES,否則NO

代碼

/**
 *     author:     TelmaZzzz
 *     create:     2019-10-02-21.46.23
**/
#include <map>
#include <set>
#include <ctime>
#include <cmath>
#include <queue>
#include <stack>
#include <ctime>
#include <string>
#include <vector>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
//#include <random>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef double db;
void _R(int &x) { scanf("%d", &x); }
void _R(ll &x) { scanf("%lld", &x); }
void _R(db &x) { scanf("%lf", &x); }
void _R(char &x) { scanf(" %c", &x); }
void _R(char *x) { scanf("%s", x); }
void R() {}
template<class T, class... U> void R(T &head, U &... tail) { _R(head); R(tail...); }
void _W(const int &x) { printf("%d", x); }
void _W(const ll &x) { printf("%lld", x); }
void _W(const db &x) { printf("%.16f", x); }
void _W(const char &x) { putchar(x); }
void _W(const char *x) { printf("%s", x); }
template<class T> void _W(const vector<T> &x) { for (auto i = x.begin(); i != x.end(); _W(*i++)) if (i != x.cbegin()) putchar(' '); }
void W() {}
template<class T, class... U> void W(const T &head, const U &... tail) { _W(head); putchar(sizeof...(tail) ? ' ' : '\n'); W(tail...); }
#define rep(x,y,z) for(int x=y;x<=z;x++)
#define erp(x,y,z) for(int x=y;x>=z;x--)
#define PB push_back
#define MP make_pair
#define INF 1073741824
#define inf 1152921504606846976
#define pi 3.14159265358979323846
#define Fi first
#define Se second
//#pragma comment(linker,"/STACK:10240000,10240000")
//mt19937 rand_(time(0));
const int N=1200,M=2e6;
const long long mod=1e9+7;
inline int read(){int ret=0;char ch=getchar();bool f=1;for(;!isdigit(ch);ch=getchar()) f^=!(ch^'-');for(;isdigit(ch);ch=getchar()) ret=(ret<<1)+(ret<<3)+ch-48;return f?ret:-ret;}
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll ksm(ll a,ll b,ll mod){int ans=1;while(b){if(b&1) ans=(ans*a)%mod;a=(a*a)%mod;b>>=1;}return ans;}
ll inv2(ll a,ll mod){return ksm(a,mod-2,mod);}//逆元
//int head[N],NEXT[M],ver[M],tot;void link(int u,int v){ver[++tot]=v;NEXT[tot]=head[u];head[u]=tot;}
void TelmaZzzz(){
#ifndef ONLINE_JUDGE
    freopen("1.txt","r",stdin);
#endif
}
 
vector<pair<int,int> >E[N];
queue<pair<int,int> >q;
bool vis[N][N];
bool hm[N];
int ml[N];
int main(){
    TelmaZzzz();
    //ios::sync_with_stdio(false);
    int n,w,c,h,m;
    int u,v,val;
    R(n,w,c,h,m);
    int inp;
    rep(i,1,h){
        R(inp);
        hm[inp]=true;
        //R(hm[i]);
    }
    rep(i,1,m){
        R(ml[i]);
    }
    rep(i,1,w){
        R(u,val,v);
        E[v].PB(MP(u,val));
    }
    rep(i,1,m){
        rep(j,1,m){
            q.push(MP(ml[i],ml[j]));
            vis[ml[i]][ml[j]]=true;
        }
    }
    while(q.size()){
        pair<int,int> now=q.front();
        q.pop();
        //cout<<now.Fi<<' '<<now.Se<<endl;
        for(auto &x:E[now.Fi]){
            for(auto &y:E[now.Se]){
                //cout<<x.Fi<<' '<<y.Fi<<endl;
                if(vis[x.Fi][y.Fi]) continue;
                if(x.Se==y.Se){
                    vis[x.Fi][y.Fi]=true;
                    q.push(MP(x.Fi,y.Fi));
                }
            }
        }
    }
    rep(i,0,n-1){
        if(!hm[i]) continue;
        rep(j,0,n-1){
            if(!hm[j]){
                if(vis[i][j]){
                    puts("YES");
                    return 0;
                }
            }
        }
    }
    puts("NO");
    return 0;
    //cout << "time: " << (long long)clock() * 1000 / CLOCKS_PER_SEC << " ms" << endl;
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章