• 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
    ");
                    continue;
                }
                else
                {
                    printf("YES
    ");
                    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
    ");
                    continue;
                }
                else
                {
                    printf("YES
    ");
                    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
    ");
            else if(C==D) printf("2
    ");
            else printf("3
    ");
        }
    
        return 0;
    }
  • 相关阅读:
    Orleans 2 实例
    Linux基础1 目录和文件系统
    C#中的异步多线程补充1
    委托的小例子(基本委托,匿名方法,lambda)
    Orleans 1 基本概念
    WPF10 Binding-2
    WPF9 Binding-1
    WPF8 UI布局
    WPF7 布局控件
    软工总结
  • 原文地址:https://www.cnblogs.com/zufezzt/p/6421439.html
Copyright © 2020-2023  润新知