HDU 3904 A tree game(樹的刪邊遊戲,樹形圖博弈)
阿新 • • 發佈:2019-02-12
題意:有一棵樹,每一次操作有兩步,第一步選擇一條邊刪除,第二步把沒有和根相連的邊和點全部移走。最後操作的獲勝。
又是賈志豪神牛的論文:組合遊戲略述 ——淺談SG遊戲的若干拓展及變形
葉子節點的SG值為0;中間節點的SG值為它的所有子節點的SG值加1 後的異或和。
證明詳見論文。
在操作的時候,由於是樹,我還是當作無向來做,加入兩條邊,然後遞迴的時候帶入父節點,避免重複。
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<vector> #include<algorithm> #define N 10005 #define LL long long #define inf 1<<29 #define eps 1e-7 using namespace std; vector<int>v[100005]; int get_sg(int u,int pre){ int ret=0; for(int i=0;i<v[u].size();i++){ if(v[u][i]!=pre) ret^=(1+get_sg(v[u][i],u)); } return ret; } int main(){ int t,n; scanf("%d",&t); while(t--){ scanf("%d",&n); for(int i=1;i<=n;i++) v[i].clear(); for(int i=1;i<n;i++){ int x,y; scanf("%d%d",&x,&y); v[x].push_back(y); v[y].push_back(x); } if(get_sg(1,-1)) puts("Alice"); else puts("Bob"); } return 0; }