poj2912 帶權並查集,類似食物鏈

真是看不懂題目,看題解才知道它要幹嘛

枚舉裁判。。

如果只有一個裁判,輸出確定他人不是裁判所需最大行數,用數組error記錄

如果沒有裁判輸出impossible,多個裁判不確定

注意unionset推的關係

#include <iostream>
#include<stdio.h>
#include<math.h>
#include<algorithm>
#include<cstring>
#include<string>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<stack>
using namespace std;
#define FOR(i,j,k) for(int i=j;i<=k;i++)
#define mod 1000000007
#define N 510
int f[N];
int r[N];
int error[N];
struct node{
    int u,v,w;
}edge[2010];
int n;
int find(int x)
{
    if(x==f[x])return f[x];
    int t=f[x];
    f[x]=find(f[x]);
    r[x]=(r[t]+r[x])%3;
    return f[x];
}
bool unionset(int a,int b,int w)
{
    int aa=find(a),bb=find(b);
    if(aa==bb)
    {
        if((r[a]+w)%3==r[b])
            return true;
        else return false;
    }
    f[bb]=aa;
    r[bb]=(r[a]+w-r[b]+3)%3;
    return true;
}
void init()
{
    FOR(i,1,n)
    f[i]=i;
    memset(r,0,sizeof(r));
}
int main()
{
    int m;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        char op;
        FOR(i,1,m)
        {
            scanf("%d%c%d",&edge[i].u,&op,&edge[i].v);
            edge[i].u++,edge[i].v++;
            if(op=='=')
                edge[i].w=0;
            if(op=='<')
                edge[i].w=1;
            if(op=='>')
                edge[i].w=2;
        }
        memset(error,0,sizeof(error));
        FOR(i,1,n)                          //枚舉i爲裁判
        {
            init();
            FOR(j,1,m)
            {
                if(edge[j].u==i||edge[j].v==i) continue;
                if(unionset(edge[j].u,edge[j].v,edge[j].w)==false)
                {
                    error[i]=j;
                    break;
                }
            }
        }
        int ans=0;
        int ans2=0;
        int shu=0;
        FOR(i,1,n)
        {
            //cout<<i<<" "<<error[i]<<endl;
            if(error[i]==0)
                ans=i,shu++;
            ans2=max(ans2,error[i]);
        }
        ans--;
        if(shu>1)
            printf("Can not determine\n");
        if(shu==0)
            printf("Impossible\n");
        if(shu==1)
            printf("Player %d can be determined to be the judge after %d lines\n",ans,ans2);
    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章