【POJ3710】Christmas Game (博弈-树上的删边问题)
2016-04-20 14:08
281 查看
【题目】
Description Harry and Sally were playing games at Christmas Eve. They drew some Christmas trees on a paper: #include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #include<queue> #include<stack> using namespace std; #define Maxn 110 #define Maxm 110 #define Maxk 550 struct node { int x,y,next,p; }t[Maxk*2];int len; int first[Maxn*2],fa[Maxn*2],dep[Maxn*2]; int n,m; bool vis[Maxn],mark[Maxn]; void ins(int x,int y) { t[++len].x=x;t[len].y=y;t[len].p=1; t[len].next=first[x];first[x]=len; } stack<int > s; int ffind(int x,int f) { vis[x]=1; dep[x]=dep[f]+1; //s.push(x); int now=0; for(int i=first[x];i;i=t[i].next) if(t[i].p==1) { int y=t[i].y; t[i].p=0;t[(i%2==0)?i-1:i+1].p=0; if(vis[y]) { t[i].p=-1,t[(i%2==0)?i-1:i+1].p=-1; if((dep[x]-dep[y]+1)%2==1) ins(y,++m); return y; } else if(now=ffind(y,x)) t[i].p=-1,t[(i%2==0)?i-1:i+1].p=-1; } if(x==now) return 0; return now; } int get_sg(int x,int f) { int ans=0; for(int i=first[x];i;i=t[i].next) if(t[i].y!=f&&t[i].p!=-1) { ans^=(get_sg(t[i].y,x)+1); } return ans; } int main() { while(scanf("%d",&n)!=EOF) { int ans=0; while(n--) { int k; scanf("%d%d",&m,&k); memset(first,0,sizeof(first)); len=0; for(int i=1;i<=k;i++) { int x,y; scanf("%d%d",&x,&y); ins(x,y);ins(y,x); } memset(vis,0,sizeof(vis)); memset(mark,1,sizeof(mark)); dep[0]=0; ffind(1,0); ans^=get_sg(1,0); } if(ans==0) printf("Harry\n"); else printf("Sally\n"); } return 0; } [POJ3710] 2016-04-21 12:58:40 相关文章推荐
|