1 条题解

  • 0
    @ 2025-10-8 21:40:36

    G60 有向图游戏 SG函数【博弈论】

    #include<bits/stdc++.h>
    using namespace std;
    const int N=1001;
    int sg[N],n;
    vector<int>p[N];
    int dfs(int now)
    {
        if(sg[now]!=-1) return sg[now];
        bool vis[1001]={0};
        for(int i=0;i<p[now].size();i++)
            vis[dfs(p[now][i])]=1;
        int i=0;
        while(vis[i]) i++;
        return sg[now]=i;
    }
    int main()
    {
        while(scanf("%d",&n)!=EOF)
    	{
            memset(sg,-1,sizeof(sg));
            for(int i=0;i<n;i++)
    		{
                int a;scanf("%d",&a);
                p[i].clear();
                for(int j=0,x;j<a;j++)
    			{
                    scanf("%d",&x);
                    p[i].push_back(x);//每个棋子都是孤立的,𝑘 个棋子拆分成 𝑘 个有向图游戏,利用 SG 定理判断即可
                }
            }
            int q;
            while(scanf("%d",&q)&&q)
    		{
                int ans=0;
                for(int i=0,x;i<q;i++)
    			{
                    scanf("%d",&x);
                    ans^=dfs(x);
                }
                puts(ans?"WIN":"LOSE");
            }
        }
        return 0;
    }
    
    • 1

    G60*【博弈SG】练习1:在图中求SG

    信息

    ID
    368
    时间
    1000ms
    内存
    128MiB
    难度
    6
    标签
    递交数
    51
    已通过
    16
    上传者