• BOI2003 && 洛谷P1892 团伙


    并查集小水题啦。

    题目描述
    1920年的芝加哥,出现了一群强盗。如果两个强盗遇上了,那么他们要么是朋友,要么是敌人。而且有一点是肯定的,就是:
    
    我朋友的朋友是我的朋友;
    
    我敌人的敌人也是我的朋友。
    
    两个强盗是同一团伙的条件是当且仅当他们是朋友。现在给你一些关于强盗们的信息,问你最多有多少个强盗团伙。
    
    输入输出格式
    
    输入格式:
    输入文件gangs.in的第一行是一个整数N(2<=N<=1000),表示强盗的个数(从1编号到N)。
    第二行M(1<=M<=5000),表示关于强盗的信息条数。
    以下M行,每行可能是F p q或是E p q(1<=p q<=N),F表示p和q是朋友,E表示p和q是敌人。
    输入数据保证不会产生信息的矛盾。
    
    输出格式:
    输出文件gangs.out只有一行,表示最大可能的团伙数。
    
    输入输出样例
    
    输入样例#1: 复制
    6
    4
    E 1 4
    F 3 5
    F 4 6
    E 1 2
    
    输出样例#1: 复制
    3

    看到那句朋友的朋友就是我的朋友其实就发现是并查集啦。(没发现的请恶补并查集谢谢

    那么敌人的敌人是朋友怎么办呢?

    我们一般的解决方法就是开两倍空间啊(当然也有一些玄学代码啊),使得一个人同时就有两个数组来存敌人和朋友啊。那么就结束啦。

    放代码走人了。。。

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<cstring>
    #include<algorithm>
    #include<queue>
    #include<set>
    using namespace std;
    int n,m,sum;
    int f[2010];
    char c[3];
    int fi(int x) {
        if (x==f[x]) return x;
        return f[x]=fi(f[x]);
    }
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n*2;i++) f[i]=i; 
        for(int i=1;i<=m;i++) {
            int a,b,aa,bb,fa,fb;
            scanf("%s",&c);
            scanf("%d%d",&a,&b);
            if(c[0]=='F') f[fi(a)]=fi(b);
            else {
                f[fi(a+n)]=fi(b);
                f[fi(b+n)]=fi(a);
            }
        }
        for(int i=1;i<=n;i++)
            if(f[i]==i) sum++;
        cout<<sum<<endl;
        return 0;
    }

    不懂请留言啊。

    谢谢。

    ---OI是信仰,是真正应该被认真以待的东西.....!
  • 相关阅读:
    oracle中Blob和Clob类型的区别
    为什么要分库分表
    Enable file editing in Visual Studio's debug mode
    SQL Server Dead Lock Log
    Debug .NET Framework Source
    SQL Server text field里面有换行符的时候copy到excel数据会散乱
    诊断和修复Web测试记录器(Web Test Recorder)问题
    Can't load Microsoft.ReportViewer.ProcessingObjectModel.dll
    'telnet' is not recognized as an internal or external command
    Linq to XML
  • 原文地址:https://www.cnblogs.com/qxyzili--24/p/10441184.html
Copyright © 2020-2023  润新知