Atcoder #017 agc017 D.Game on Tree 樹上NIM 博弈
阿新 • • 發佈:2017-07-10
不為 gmail ace first n) long long let fin 模板
LINK
題意:樹上NIM的模板題,給出一顆樹,現有操作刪去端點不為根節點的邊,其另一端節點都將被移除,不能取者為敗
思路:一看就是個NIM博弈題,只是搬到樹上進行,樹上DFS進行異或 記得#014D題也是一模一樣的博弈...巨水 比賽B題沒想出來先做了這題:P
/** @Date : 2017-07-09 21:15:04 * @FileName: D 樹上刪邊 NIM 博弈.cpp * @Platform: Windows * @Author : Lweleth ([email protected]) * @Link : https://github.com/ * @Version : $Id$ */ #include <bits/stdc++.h> #define LL long long #define PII pair #define MP(x, y) make_pair((x),(y)) #define fi first #define se second #define PB(x) push_back((x)) #define MMG(x) memset((x), -1,sizeof(x)) #define MMF(x) memset((x),0,sizeof(x)) #define MMI(x) memset((x), INF, sizeof(x)) using namespace std; const int INF = 0x3f3f3f3f; const int N = 1e5+20; const double eps = 1e-8; vectoredg[N]; int get_sg(int x,int pre) { int ret = 0; for(auto i:edg[x]) { if(i!=pre) ret^=(1 + get_sg(i, x)); } return ret; } int main() { int n; while(~scanf("%d", &n)) { for(int i = 1; i <= n; i++) edg[i].clear(); for(int i=1; i<n; i++) { int x, y; scanf("%d%d",&x, &y); edg[x].PB(y); edg[y].PB(x); } if(get_sg(1, -1)) puts("Alice"); else puts("Bob"); } return 0; }
Atcoder #017 agc017 D.Game on Tree 樹上NIM 博弈