• hdu 4115 石头剪子布(2-sat问题)


    /*
    题意:石头剪子布,现在已知n回合bob将会出什么,对alice有限制,对于u,v,w;如果w=0说明a,b回合必须出的一样
    否则,必须不一样。alice如果输一回合就输了,否则就赢了
    解:
    2-sat
    alice有两个选择要么平手要么赢。
    对于第u回合,alice可以出au,bu;
    对于第v回合,alice可以出av,bv;
    当w=0那么第u回合和第v回合必须相同
    比较au和bu。bv是否矛盾,如果矛盾建两条边
    比较av和bu。bv是否矛盾,如果矛盾建两条边
    当w=1第u回合和第v回合必须不相同
    比较au和bu。bv是否矛盾,如果矛盾建两条边
    比较av和bu。bv是否矛盾,如果矛盾建两条边
    */
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #include<algorithm>
    using namespace std;
    #define N 21000
    #define NN 11000
    struct node
    {
        int u,v,next;
    } bian[NN*20];
    int head[N],yong,low[N],dfn[N],belong[N],ans,top,index,stac[N],vis[N];
    void init()
    {
        memset(head,-1,sizeof(head));
        yong=index=ans=top=0;
        memset(vis,0,sizeof(vis));
        memset(dfn,0,sizeof(dfn));
    }
    void addedge(int u,int v)
    {
        bian[yong].v=v;
        bian[yong].next=head[u];
        head[u]=yong++;
    }
    void tarjan(int u)
    {
        low[u]=dfn[u]=++index;
        stac[++top]=u;
        vis[u]=1;
        int i;
        for(i=head[u]; i!=-1; i=bian[i].next)
        {
            int v=bian[i].v;
            if(!dfn[v])
            {
                tarjan(v);
                low[u]=min(low[u],low[v]);
            }
            else if(vis[v])
                low[u]=min(low[u],dfn[v]);
        }
        if(low[u]==dfn[u])
        {
            ans++;
            int t;
            do
            {
                t=stac[top--];
                belong[t]=ans;
                vis[t]=0;
            }
            while(t!=u);
        }
    }
    int slove(int n)
    {
        int i;
        for(i=0; i<n*2; i++)
            if(!dfn[i])
                tarjan(i);
        // printf("%d
    ",ans);
        for(i=0; i<n; i++)
            if(belong[i]==belong[i+n])
                return 0;
        return 1;
    }
    void Switch(int f,int &au,int &av)
    {
        au=f;
        av=(f+1)%3;
        return ;
    }
    int a[N];
    int main()
    {
        int t,n,m,i,k=0,u,v,w;
        int au,av,bu,bv;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d%d",&n,&m);
            for(i=0; i<n; i++)
            {
                scanf("%d",&a[i]);
                a[i]--;
            }
            init();
            for(i=0; i<m; i++)
            {
                scanf("%d%d%d",&u,&v,&w);
                u--;
                v--;
                Switch(a[u],au,av);
                Switch(a[v],bu,bv);
                if(!w)
                {
                    if(au!=bu)
                    {
                        addedge(u,v+n);
                        addedge(v,u+n);
                    }
                    if(au!=bv)
                    {
                        addedge(u,v);
                        addedge(v+n,u+n);
                    }
                    if(av!=bu)
                    {
                        addedge(u+n,v+n);
                        addedge(v,u);
                    }
                    if(av!=bv)
                    {
                        addedge(u+n,v);
                        addedge(v+n,u);
                    }
                }
                else
                {
                    if(au==bu)
                    {
                        addedge(u,v+n);
                        addedge(v,u+n);
                    }
                    if(au==bv)
                    {
                        addedge(u,v);
                        addedge(v+n,u+n);
                    }
                    if(av==bu)
                    {
                        addedge(u+n,v+n);
                        addedge(v,u);
                    }
                    if(av==bv)
                    {
                        addedge(u+n,v);
                        addedge(v+n,u);
                    }
                }
            }
            if(!slove(n))
                printf("Case #%d: no
    ",++k);
            else
                printf("Case #%d: yes
    ",++k);
        }
        return 0;
    }
    

  • 相关阅读:
    一文读懂比特币的软分叉
    区块链的七阶段位,你属于哪一段?
    总价值超26.7亿美元的5个最富有比特币地址汇总
    智能合约的沙箱机制是什么?
    区块链的核心技术是什么?
    区块链和比特币常见的七大误区
    矿机论斤卖?夸大其词
    比特币跌破5000美元的三大影响因素
    微软Azure区块链开发工具包三大功能详解
    各大自媒体平台的收益情况汇总
  • 原文地址:https://www.cnblogs.com/thefirstfeeling/p/4410545.html
Copyright © 2020-2023  润新知