URAL 1045 Funny Game

        由于这个是一个有向图上的游戏,而且符合公平组合游戏的基本特征,所以可以直接求解各个节点的SG函数值。

#include<stdio.h>
#include<string.h>
#define MAXD 1010
#define MAXM 2010
int N, K, first[MAXD], next[MAXM], e, v[MAXM], sg[MAXD], h[MAXD][MAXD];
void add(int x, int y)
{
    v[e] = y;
    next[e] = first[x], first[x] = e ++;    
}
void dfs(int cur, int fa)
{
    int i;
    memset(h[cur], 0, sizeof(h[cur]));
    for(i = first[cur]; i != -1; i = next[i])
        if(v[i] != fa)    
        {
            dfs(v[i], cur);
            h[cur][sg[v[i]]] = 1;    
        }
    for(i = 0; h[cur][i]; i ++);
    sg[cur] = i;
}
void init()
{
    int i, j, k, x, y;
    memset(first, -1, sizeof(first));
    e = 0;
    for(i = 1; i < N; i ++)    
    {
        scanf("%d%d", &x, &y);
        add(x, y), add(y, x);
    }
}
void solve()
{
    int i, j, k;    
    dfs(K, -1);
    if(sg[K] == 0)
        printf("First player loses\n");
    else
    {
        k = N;
        for(i = first[K]; i != -1; i = next[i])    
        {
            if(sg[v[i]] == 0 && v[i] < k)
                k = v[i];
        }
        printf("First player wins flying to airport %d\n", k);
    }
}
int main()
{
    while(scanf("%d%d", &N, &K) == 2)
    {
        init();
        solve();    
    }
    return 0;    
}
原文地址:https://www.cnblogs.com/staginner/p/2486107.html