洛谷 P2078 朋友(并查集)

【题目信息】

洛谷 P2078 朋友(并查集)

 

【审题】

1.只能异性恋

2.两个公司只有小红小明认识

3.朋友的朋友是朋友

 

【分析】

这是一道很简单的并查集模板题。由“【审题】3”可知,直接把有关系的都放在一个集合里,然后找到同时有小明和小红的集合,输出该集合中男女人数中较小的一个。

 

【心路历程】

没看题解的时候,一直在纠结如何找到男女重合人数最多的集合,直到看到第一个题解,才发现,能同时有男有女的集合只能有一个,就是小明小红所在集合。
所以压根不用去遍历每个集合,直接输出即可。

 

【代码】

#include<bits/stdc++.h>
using namespace std;
int n,m,p,q;
map<int,int>fa;
int find(int x)
{
    if(fa[x]==x) return x;
    return fa[x]=find(fa[x]);
}
void merge(int x,int y)
{
    x=find(x),y=find(y);
    if(x!=y)
    {
        fa[x]=find(fa[y]);
    }
}

int main()
{
    int x,y;
    scanf("%d %d %d %d",&n,&m,&p,&q);
    for(int i=-1*m;i<=n;i++) fa[i]=i;
    for(int i=1;i<=p+q;i++)
    {
        scanf("%d %d",&x,&y);
        merge(x,y);
    }
    int to1=0,to2=0; 
    for(int i=-1*m;i<=-1;i++)
    {
        if(find(fa[i])==find(-1)) to1++;
    }
    for(int j=-1*m;j<=n;j++)
    {
        if(find(fa[j])==find(1)) to2++ ;
    }
    printf("%d",min(to1,to2));
    return 0; 
}

 

每日一句:

You cannot blame the gravity for falling in love.

posted @ 2021-08-27 10:04  TheZealous  阅读(108)  评论(0编辑  收藏  举报