AcWing1319 移棋子问题(博弈论模板)

简单sg函数

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<unordered_set>
#include<cstring>
using namespace std;
const int N=1e4;
int h[N],e[N],ne[N],idx;
int f[N];
void add(int a,int b){
    e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
int sg(int x){
    if(f[x]!=-1)
    return f[x];
    int i;
    unordered_set<int> s;
    for(i=h[x];i!=-1;i=ne[i]){
        int j=e[i];
        s.insert(sg(j));
    }
    for(i=0;;i++){
        if(!s.count(i))
        return f[x]=i;
    }
}
int main(){
    int n,m,k;
    cin>>n>>m>>k;
    int i;
    memset(f,-1,sizeof f);
    memset(h,-1,sizeof h);
    for(i=0;i<m;i++){
        int u,v;
        cin>>u>>v;
        add(u,v);
    }
    int res=0;
    for(i=0;i<k;i++){
        int x;
        cin>>x;
        res^=sg(x);
    }
    if(res)
    cout<<"win"<<endl;
    else
    cout<<"lose"<<endl;
}
View Code

猜你喜欢

转载自www.cnblogs.com/ctyakwf/p/12561049.html
今日推荐