团伙(并查集)

题目描述

现在有 n 个人,他们之间有两种关系:朋友和敌人。我们知道:

  • 一个人的朋友的朋友是朋友
  • 一个人的敌人的敌人是朋友

现在要对这些人进行组团。两个人在一个团体内当且仅当这两个人是朋友。请求出这些人中最多可能有的团体数。

输入格式

第一行输入一个整数 n 代表人数。

第二行输入一个整数 m 表示接下来要列出 m 个关系。

接下来 mm 行,每行一个字符 opt 和两个整数 p,q,分别代表关系(朋友或敌人),有关系的两个人之中的第一个人和第二个人。其中 opt有两种可能:

  • 如果 opt为 F,则表明 p 和 q 是朋友。
  • 如果 opt 为 E,则表明 p 和 q 是敌人。

输出格式

一行一个整数代表最多的团体数

输入输出样例

输入 #1
6
4
E 1 4
F 3 5
F 4 6
E 1 2
输出 #1
3
分析:
直接并查集代码
复制代码
#include<iostream>
#include <bits/stdc++.h>
#include <cstring>
#include <algorithm>
using namespace std;
int pre[1002],e[1002];
void init(int n)
{
    for(int i=1;i<=n;i++)
    {
        pre[i]=i;//先全部记为自己
        e[i]=0;
    }
}
int find(int a)
{
    if(pre[a]==a) return a;//找组织
    else return pre[a]=find(pre[a]);
}
void join(int x,int y)
{
    int fx=find(x);
    int fy=find(y);
    if(fx!=fy) pre[fx]=fy;//替代
}
int main()
{
    int n,m;
    cin>>n;
    cin>>m;
    init(n);
    while(m--)
    {
        char c;
        int a,b;
        cin>>c>>a>>b;
        if(c=='E')
        {
            if(e[a]) join(e[a],b);//若为0 则是朋友
            if(e[b]) join(e[b],a);
            e[a]=b;
        }
        else join(a,b);
    }
    int ans=0;
    for(int i=1;i<=n;i++)
    {
        if(pre[i]==i) ans++;//为自己的说明是独自的一个组
    }
    cout<<ans;
    return 0;
}
复制代码

 



posted @   VonSafen  阅读(167)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示