1. 程式人生 > >2599 A funny game NP狀態定理

2599 A funny game NP狀態定理

題目:有一棵無向樹,從某個結點出發,兩個人輪流移動,走過的結點不能再走,不能移動的人輸。判斷先手必勝還是先手必敗,如果先手必勝,輸出必勝到達的節點。

思路:利用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
//0x3f3f3f3f

const 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;
}


相關推薦

2599 A funny game NP狀態定理

題目:有一棵無向樹,從某個結點出發,兩個人輪流移動,走過的結點不能再走,不能移動的人輸。判斷先手必勝還是先手必敗,如果先手必勝,輸出必勝到達的節點。 思路:利用NP狀態定理,把起點的SG值算出來。 程式碼: #pragma comment(linker, "/STACK:1

poj 2484 A Funny Game

poj spa 是個 data != while code pri urn 題目:http://poj.org/problem?id=2484 一,題意: n個硬幣圍成一個圈,Alice與Bob輪流從圈中取硬幣。每次能夠取一枚或者連續的兩枚。 硬幣取走後留下的

POJ2599 A funny game (圖博弈)

dfs track ems put std rep int layer 最小 題目鏈接:傳送門 題意: 給定一個圖,兩個人從起點出發,輪流開飛機。當離開這個點後這個點 就不能使用了。假設輪到誰了誰不能飛了就輸了。 必敗狀態非常好找,當一個人在位置s的時候

POJ 2484 A Funny Game(智商博弈)

src search 證明 ear 奇數 mem output pos 博弈 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6397 Accepted: 397

每天一道博弈論之“A funny game”(poj 2484)

log tar 硬幣 -s 獨立遊戲 div size 狀態 http 題意:   n枚硬幣排成一個環,操作為可以選擇相鄰的兩個取走(相鄰指的是最開始相鄰,即不會自動補成環)。問先手勝還是後手勝。 題解:   首先我們考慮1和2,則明顯是先手必勝。  

poj 2484 A Funny Game (簡單博弈)

題目連結:poj 2484 題意:給出n個順時針排列的n枚硬幣,每次只能取一個或者取相鄰的兩枚,Alice先取,問:誰取走最後一枚硬幣? 題解:這題很gou,看看程式碼你就知道了。 ///當n>=3時,Alice先拿,會把環拆成一條鏈,假如剩下奇數個硬幣數, ///那麼Bob只

POJ 2484 A Funny Game 博弈思想:複製對手操作

傳送門 這一題如果先手不能取完的話,後手一定可以通過取 1 個或者 2 個把局勢變成兩個對稱的局面,後面每一步都可以複製對方的操作,最終自己勝利。 #include <bits/stdc++.h> using namespace std; int main() { in

A Funny Game POJ

傳送門 題意:n枚硬幣排成一個圈,ALICE和BOB輪流從中取一枚或者兩枚硬幣,不過,取兩枚時,所取的兩枚硬幣必須是連續的。硬幣取走後留下空位,相隔空位的硬幣視為不連續的。ALICE開始先取,取走最後一枚硬幣的一方獲勝。當雙方都採取最有策略時,誰會獲勝? 不好解釋,先附上

POJ 2484 - A Funny Game(博弈)

題目連結 https://cn.vjudge.net/problem/POJ-2484 【題意】 n枚硬幣圍成一圈,Alice和Bob輪流取,每次取一枚或連續的兩枚。硬幣取走之後留下空位,相隔空位的硬幣是不連續的。Alice先取,取走最後一枚硬幣的一方獲勝。輸入n,當雙方都採取最優策略時

uva 1378 - A Funny Stone Game sg博弈

1.0 mat cto i+1 clas typedef article 移動 post 題意:David 玩一個石子遊戲。遊戲中,有n堆石子,被編號為0..n-1。兩名玩家輪流取石子。 每一輪遊戲。每名玩家選取3堆石子i,j,k(i<j,j<=k,且至

Uva 1378 A Funny Stone Game (ACM ICPC 2006 Asia Regional Contest Beijing A Funny Stone Game)Nim 博弈

傳送門 王曉珂的題解乍一看非常難理解,且聽我慢慢解釋。 首先考慮這樣一個子問題: 當前棋子堆的編號為 m , 要求你把這個堆,並且放入兩堆編號分別小於 m 的棋子, 這裡分別計為 i, j (i, j < m) 那麼這種情況的 SG 是怎麼求的呢? 設當前編號 m 對應的局

百練2505:A multiplication game

unsigned stdio.h multi ios ica ret reg cti std 傳送門:http://bailian.openjudge.cn/practice/2505/ 【題解】 我們找找規律: 1~9顯然是Stan wins. 10~18是Ollie w

洛谷P2964 [USACO09NOV]硬幣的遊戲A Coin Game

ima sin 兩枚 bar each player rom mem when P2964 [USACO09NOV]硬幣的遊戲A Coin Game 題目描述 Farmer John‘s cows like to play coin ga

Codeforces Round #436 A. Fair Game

set string ems 題意 include 代碼 example return round 題意:給你n張卡片,上面寫有數字,兩個人選擇兩個數字,把相同數字的卡片都拿走,問能不能拿走所有的卡片並且兩個人拿的卡片書相同。 Examples Input 4112727

POJ 2425 A Chess Game 博弈論 sg函數

數組 scanf 博弈 break struct itl clu using b- http://poj.org/problem?id=2425 典型的sg函數,建圖搜sg函數預處理之後直接求每次遊戲的異或和。仍然是因為看不懂題目卡了好久。 這道題大概有兩個坑, 1.是搜索

poj 2505 A multiplication game

sin turn 必須 col href 開始 esp 得到 style A multiplication game POJ - 2505 題目大意:兩個人輪流玩遊戲,Stan先手,數字 p從1開始,Stan乘以一個2-9的數,然後Ollie再乘以一個2-9的數,直

Gym10081 A - Arcade Game -康托展開、全排列、組合數變成遞推的思想

.net 全排列 over inpu net for each problem scan different 最近做到好多概率,組合數,全排列的題目,本鹹魚不會啊,我概率論都掛科了。。。 這個題學到了一個康托展開,有點用,瞎寫一下。。。 康托展開: 適用對象:沒有重復元

「POJ2505」A multiplication game [博弈論]

== 思路 相關 無語 兩個 scan n) include 區間 題目鏈接:http://poj.org/problem?id=2505 題目大意: 兩個人輪流玩遊戲,Stan先手,數字 p從1開始,Stan乘以一個2-9的數,然後Ollie再乘以一個2-9的數,直到誰先

[HDU3094]A tree game

根節點 pac .com 策略 min tin 單獨 tchar inline https://zybuluo.com/ysner/note/1232552 題面 一棵\(n\)個點的有根樹,兩個人輪流操作。一次操作是選擇一條邊,刪除此邊以及刪掉邊後和根不連通的部分。詢問誰