程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDU 1524 A Chess Game (有向無環圖SG博弈)

HDU 1524 A Chess Game (有向無環圖SG博弈)

編輯:C++入門知識

轉載請注明出處,謝謝 http://blog.csdn.net/ACM_cxlove?viewmode=contents           by---cxlove
這是一個針對有向無環圖的博弈。
題目:有N個位置,其中存在拓撲關系,移動時必須遵守。最後移動者勝,問是否有必勝策略
http://acm.hdu.edu.cn/showproblem.php?pid=1524
拓撲關系,說明是一個有向無環圖。那麼對於某個點的SG函數,便是他的後繼結點中沒有出現的最小的。(MEX操作),完全就是名字懸乎一點
和求普通的SG函數一樣。
[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[1005]; 
int n,sg[1005]; 
int get_sg(int n){ 
    if(sg[n]!=-1) 
       return sg[n]; 
    if(v[n].size()==0) 
       return 0; 
    int vis[1005]; 
    memset(vis,0,sizeof(vis)); 
    for(int i=0;i<v[n].size();i++){ 
        sg[v[n][i]]=get_sg(v[n][i]); 
        vis[sg[v[n][i]]]=1; 
    } 
    for(int i=0;;i++) 
        if(vis[i]==0) 
            return i; 

int main(){ 
    while(scanf("%d",&n)!=EOF){ 
        memset(sg,-1,sizeof(sg)); 
        for(int i=0;i<n;i++){ 
            v[i].clear(); 
            int k,u; 
            scanf("%d",&k); 
            while(k--){ 
                scanf("%d",&u); 
                v[i].push_back(u); 
            } 
        } 
        int q,k,u; 
        while(scanf("%d",&k)&&k){ 
            int ret=0; 
            while(k--){ 
                scanf("%d",&u); 
                if(sg[u]==-1) 
                    sg[u]=get_sg(u); 
                ret^=sg[u]; 
            } 
            if(ret==0) 
                puts("LOSE"); 
            else 
                puts("WIN"); 
        } 
    } 
    return 0; 

作者:ACM_cxlove

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