生活随笔
收集整理的這篇文章主要介紹了
2018.09.16 loj#10243. 移棋子游戏(博弈论)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
傳送門
題目中已經給好了sg圖,直接在上面跑出sg函數即可。
最后看給定點的sg值異或和是否等于0就判好了。
代碼:
#include<bits/stdc++.h>
#define N 2005
#define M 6005
using namespace std;
int n,m,k,sg[N],first[N],First[N],du[N],cnt=
0,ans=
0;
bool vis[N];
queue<int>q;
struct edge{
int v,next;}e[M],E[M];
inline void add(
int u,
int v){e[++cnt].v=v,e[cnt].next=first[u],first[u]=cnt;E[cnt].v=u,E[cnt].next=First[v],First[v]=cnt;
}
inline int max(
int a,
int b){
return a>b?a:b;}
inline int read(){
int ans=
0;
char ch=getchar();
while(!
isdigit(ch))ch=getchar();
while(
isdigit(ch))ans=(ans<<
3)+(ans<<
1)+(ch^
48),ch=getchar();
return ans;
}
int main(){n=read(),m=read(),k=read();
for(
int i=
1;i<=m;++i){
int a=read(),b=read();add(a,b),++du[a]; }
for(
int i=
1;i<=n;++i)
if(!du[i])q.push(i);
while(!q.empty()){
int x=q.front(),tmp=
0;q.pop();
for(
int i=first[x];i;i=e[i].next){
int v=e[i].v;vis[sg[v]]=
1,tmp=max(tmp,sg[v]);}
for(
int i=
0;i<=tmp+
1;++i)
if(!vis[i]){sg[x]=i;
break;}
for(
int i=
0;i<=tmp;++i)vis[i]=
0;
for(
int i=First[x];i;i=E[i].next){
int v=E[i].v;--du[v];
if(!du[v])q.push(v);}}
for(
int i=
1;i<=k;++i)ans^=sg[read()];
printf(
"%s",ans?
"win":
"lose");
return 0;
}
轉載于:https://www.cnblogs.com/ldxcaicai/p/9738251.html
總結
以上是生活随笔為你收集整理的2018.09.16 loj#10243. 移棋子游戏(博弈论)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。