codeforce gym 100548H The Problem to Make You Happy

來源:互聯網
上載者:User

標籤:

題意:

Alice和Bob在一個有向圖上玩遊戲,每個人各自操作一個棋子,如果兩個棋子走到一個點上,判定Bob輸;如果輪到任何一方走時,無法移動棋子,判定該方輸

現在Bob先走,要求判斷勝負

 

題解

模型上看是SG問題,但是通常的SG做法需要DP,但是考慮這不是DAG模型,普通的記憶化搜尋寫法會RE

正解的DP做法:dp[i][j][k]:i,j是Bob,Alice的位置,k是目前輪到誰走了。

開始將所有顯然的Bob輸的情況排入佇列中,不斷拓展,找到所有的Bob輸的情況。

轉移類似SG

#include<bits/stdc++.h>#define clr(x,y) memset((x),(y),sizeof(x))using namespace std;typedef long long LL;const int maxn=100;struct Node{    int x1,x2;    int turn; // 0:Bob 1:Alice};int n,m;int a,b;int num[maxn+5][maxn+5];int deg[maxn+5];bool mp[maxn+5][maxn+5];bool dp[maxn+5][maxn+5][2];queue <Node> Q;void solve(int iCase){    while (!Q.empty()) Q.pop();    int u,v;    clr(mp,0);    clr(deg,0);    for (int i=1;i<=m;++i)    {        scanf("%d%d",&u,&v);        ++deg[u];        mp[u][v]=true;    }    scanf("%d%d",&a,&b);    clr(dp,-1);    for (int i=1;i<=n;++i)    {        dp[i][i][0]=false;        dp[i][i][1]=false;        Q.push((Node){i,i,0});        Q.push((Node){i,i,1});    }    for (int i=1;i<=n;++i)    {        if (deg[i]==0)        {            for (int j=1;j<=n;++j)            {                if (i==j) continue;                dp[i][j][0]=false;                Q.push((Node){i,j,0});            }        }    }    clr(num,0);    while (!Q.empty())    {        Node now=Q.front();        Q.pop();        int x1=now.x1;        int x2=now.x2;        int turn=now.turn;        if (turn==0)        {            for (int i=1;i<=n;++i)            {                if (mp[i][x2])                {                    if (!dp[x1][i][1]) continue;                    dp[x1][i][1]=false;                    Q.push((Node){x1,i,1});                }            }        }        else        {            for (int i=1;i<=n;++i)            {                if (mp[i][x1])                {                    ++num[i][x2];                    if (num[i][x2]==deg[i]) //如果從i出發的所有的狀態都是必敗態,那麼dp[i][x2][0]本身也是必敗態                    {                        if (!dp[i][x2][0]) continue;                        dp[i][x2][0]=false;                        Q.push((Node){i,x2,0});                    }                }            }        }    }    if (dp[a][b][0]) printf("Case #%d: Yes\n",iCase);    else printf("Case #%d: No\n",iCase);}int main(void){    #ifdef ex    freopen ("../in.txt","r",stdin);    //freopen ("../out.txt","w",stdout);    #endif    int T;    scanf("%d",&T);    for (int i=1;i<=T;++i)    {        scanf("%d%d",&n,&m);        solve(i);    }}

 

codeforce gym 100548H The Problem to Make You Happy

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.