POJ
来源:互联网 发布:js将base64转换成文件 编辑:程序博客网 时间:2024/05/17 13:44
题目:有一棵无向树,从某个结点出发,两个人轮流移动,走过的结点不能再走,不能移动的人输。判断先手必胜还是先手必败,如果先手必胜,输出必胜到达的节点。
思路:利用NP状态定理,把起点的SG值算出来。
代码:
#pragma comment(linker, "/STACK:1024000000,1024000000")#include<iostream>#include<algorithm>#include<ctime>#include<cstdio>#include<cmath>#include<cstring>#include<string>#include<vector>#include<map>#include<set>#include<queue>#include<stack>#include<list>#include<numeric>using namespace std;#define LL long long#define ULL unsigned long long#define INF 0x3f3f3f3f#define mm(a,b) memset(a,b,sizeof(a))#define PP puts("*********************");template<class T> T f_abs(T a){ return a > 0 ? a : -a; }template<class T> T gcd(T a, T b){ return b ? gcd(b, a%b) : a; }template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;}// 0x3f3f3f3f3f3f3f3f//0x3f3f3f3fconst int maxn=1e3+5;vector<int> G[maxn];int sg[maxn];int get_sg(int u,int fa){ if(sg[u]!=-1) return sg[u]; sg[u]=0; for(int i=0;i<G[u].size();i++){ int v=G[u][i]; if(v==fa) continue; if(get_sg(v,u)==0) sg[u]=1; } return sg[u];}int main(){ int n,start,u,v; while(~scanf("%d%d",&n,&start)){ for(int i=1;i<=n;i++){ G[i].clear(); sg[i]=-1; } for(int i=1;i<n;i++){ scanf("%d%d",&u,&v); G[u].push_back(v); G[v].push_back(u); } int ans=get_sg(start,0); if(ans>0){ int id=n+1; for(int i=0;i<G[start].size();i++){ int v=G[start][i]; if(sg[v]==0) id=min(id,v); } printf("First player wins flying to airport %d\n",id); } else{ printf("First player loses\n"); } } return 0;}
阅读全文
0 0
- POJ
- poj
- POJ
- POJ
- poj
- poj
- POJ
- POJ
- poj
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- swift 带参,无参,函数加返回值。闭包
- win10 64SQLServer2008安装时报is not a valid login or you do not have permission的解决方法
- 深入理解Java:注解(Annotation)自定义注解入门
- leetcode 34 search for a range
- elasticsearch5.2.2 ik logstash5.2.2 搭建
- POJ
- MyBatis Generator操作说明
- BIRT集成WEB项目。
- 用JS获取地址栏的参数的方法
- PHP方法参数类型声明
- 递归遍历文件夹下所有文件
- 机器学习第3章第1节 : Anaconda3的安装和汉化
- C++多态简介
- 剑指offer——61.序列化二叉树