CodeForces 766D Mahmoud and a Dictionary

并查集。

将每一个物品拆成两个,两个意义相反,然后并查集即可。

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<ctime>
#include<iostream>
using namespace std;
typedef long long LL;
const double pi=acos(-1.0);
void File()
{
    freopen("D:\\in.txt","r",stdin);
    freopen("D:\\out.txt","w",stdout);
}
template <class T>
inline void read(T &x)
{
    char c = getchar();
    x = 0;
    while(!isdigit(c)) c = getchar();
    while(isdigit(c))
    {
        x = x * 10 + c - '0';
        c = getchar();
    }
}

int n,m,q;
char s[30],t[30];
map<string,int>M;

int f[200010];

int Find(int x)
{
    if(x!=f[x]) f[x] = Find(f[x]);
    return f[x];
}

int main()
{
    scanf("%d%d%d",&n,&m,&q);
    for(int i=0;i<n;i++)
    {
        scanf("%s",s);
        M[s]=i;
    }

    for(int i=0;i<2*n;i++) f[i]=i;

    for(int i=1;i<=m;i++)
    {
        int op; scanf("%d",&op);
        scanf("%s%s",s,t);

        if(op==1)
        {
            int id1=M[s],id2=M[t];
            int A=Find(2*id1),B=Find(2*id2+1);
            if(A==B)
            {
                printf("NO\n");
                continue;
            }
            else
            {
                printf("YES\n");
                A=Find(2*id1),B=Find(2*id2);
                if(A!=B) f[A]=B;
                A=Find(2*id1+1),B=Find(2*id2+1);
                if(A!=B) f[A]=B;
            }
        }

        else
        {
            int id1=M[s],id2=M[t];
            int A=Find(2*id1),B=Find(2*id2);
            if(A==B)
            {
                printf("NO\n");
                continue;
            }
            else
            {
                printf("YES\n");
                A=Find(2*id1),B=Find(2*id2+1);
                if(A!=B) f[A]=B;
                A=Find(2*id1+1),B=Find(2*id2);
                if(A!=B) f[A]=B;
            }
        }
    }

    for(int i=1;i<=q;i++)
    {
        scanf("%s%s",s,t);
        int id1=M[s],id2=M[t];
        int A=Find(2*id1),B=Find(2*id2);
        int C=Find(2*id1),D=Find(2*id2+1);
        if(A==B) printf("1\n");
        else if(C==D) printf("2\n");
        else printf("3\n");
    }

    return 0;
}

 

posted @ 2017-02-20 20:58  Fighting_Heart  阅读(193)  评论(0编辑  收藏  举报