POJ 3710 Christmas Game
2016-03-24 17:50
309 查看
第一眼看成仙人掌上博弈了,好口怕。
然后发现环只会作为基树的叶子出现,然后通过讨论(看论文)发现环是可以缩掉的。
所以就变成树上博弈了。。。。。
听说有重边???那不应该是环吗 (⊙ˍ⊙)
然后发现环只会作为基树的叶子出现,然后通过讨论(看论文)发现环是可以缩掉的。
所以就变成树上博弈了。。。。。
听说有重边???那不应该是环吗 (⊙ˍ⊙)
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int N=100+5; struct Edge{int to,next;}e[N<<1]; int head ,cnt; void ins(int u,int v){ e[++cnt]=(Edge){v,head[u]};head[u]=cnt; } int pre ,vis ,sg ; bool oncircle ; int calc(int s,int t){ int step=1; do{oncircle[s]=1;s=pre[s];step++;}while(s!=t); oncircle[t]=0; return step&1; } void dfs(int u,int fa){ vis[u]=1;sg[u]=0;oncircle[u]=0; for(int i=head[u];i;i=e[i].next){ int v=e[i].to;if(v==fa)continue; if(!vis[v]){ pre[v]=u; dfs(v,u); }else if(vis[v]==1)sg[v]^=calc(u,v); } vis[u]=2; } void dp(int u,int fa){ for(int i=head[u];i;i=e[i].next){ int v=e[i].to;if(v==fa||oncircle[v])continue; dp(v,u);sg[u]^=sg[v]+1; } } int main(){ //freopen("a.in","r",stdin); int n; while(~scanf("%d",&n)){ int ans=0; while(n--){ int m,k;scanf("%d%d",&m,&k); for(int i=1;i<=m;i++)vis[i]=head[i]=0; cnt=0; for(int i=1;i<=k;i++){ int u,v;scanf("%d%d",&u,&v); ins(u,v);ins(v,u); } dfs(1,-1); dp(1,-1); ans^=sg[1]; } if(ans)puts("Sally"); else puts("Harry"); } return 0; }
相关文章推荐
- Could not find Developer Disk Image
- splunk (spelunking)
- 根据表中的一个字段查找另外一个表的ID更新到这个表的字段上
- MagicRecord的使用详解
- makefile中的自动化变量
- 写出方法获取ios内存使用情况
- 实验报告
- Webbrowser控件execcommand参数详解
- http://blog.csdn.net/wxwzy738/article/details/16968767
- 返回一个环状整数数组中最大子数组之和
- 服务中tomcat启动
- Glide 入门到精通之十九——动态使用 Model Loader
- 谈谈创建button时 setBackgroundImage 和setImage的区别
- 1、创建一个ROS package
- Kmeans聚类过程的动态可视化
- 来段代码提提神-Java读取config.properties文件中的key=value
- http与https的区别
- Delphi使用大图标编译程序
- 结构体
- ab压力测试