洛谷 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.