POJ2599 [树形SG博弈]记忆化

来源:互联网 发布:python 库安装 编辑:程序博客网 时间:2024/05/16 04:04

题目:题目链接

题意:

两个人从一个点出发,两个人轮流移动,直到有一个人不能移动,则游戏结束,不能移动者输。


分析:更多的可能就是搜索,用到的博弈知识,只是P/N态的常识必胜态的后继中必然有一个是必败态。剩下的就是DFS。题目结点1000,由于是树,所以时限是够的

#include <iostream>#include <cstdio>#include <string>#include <string.h>#include <map>#include <vector>#include <cstdlib>#include <cmath>#include <algorithm>#include <cmath>#include <queue>#include <set>#include <stack>using namespace std;int n, k;int ret;int mp[1001][1001];int vis[1001];int DFS(int m){    for(int i = 1; i <= n; ++i)    {        if(mp[m][i] && !vis[i])        {            vis[m] = 1;            if(!DFS(i))            {                vis[m] = 0;                ret = i;                return true;            }            vis[m] = 0;        }    }    return false;}int main(){    scanf("%d%d", &n, &k);    int a, b;    memset(mp, 0, sizeof(mp));    for(int i = 0; i < n-1; ++i)    {        scanf("%d%d", &a, &b);        mp[a][b] = 1;        mp[b][a] = 1;    }    memset(vis, 0, sizeof(vis));    int ans = DFS(k);    if(ans)        printf("First player wins flying to airport %d\n", ret);    else        printf("First player loses\n");    return 0;}

努力努力...


原创粉丝点击