程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDU 3904 A tree game(樹的刪邊游戲,樹形圖博弈)

HDU 3904 A tree game(樹的刪邊游戲,樹形圖博弈)

編輯:C++入門知識

題意:有一棵樹,每一次操作有兩步,第一步選擇一條邊刪除,第二步把沒有和根相連的邊和點全部移走。最後操作的獲勝。
又是賈志豪神牛的論文:組合游戲略述 ——淺談SG游戲的若干拓展及變形
葉子節點的SG值為0;中間節點的SG值為它的所有子節點的SG值加1 後的異或和。
證明詳見論文。
在操作的時候,由於是樹,我還是當作無向來做,加入兩條邊,然後遞歸的時候帶入父節點,避免重復。
[cpp] 
#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; 


作者:ACM_cxlove

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved