【洛谷 2078】朋友

题目背景

小明在A公司工作,小红在B公司工作。

题目描述

这两个公司的员工有一个特点:一个公司的员工都是同性。

A公司有N名员工,其中有P对朋友关系。B公司有M名员工,其中有Q对朋友关系。朋友的朋友一定还是朋友。

每对朋友关系用两个整数(Xi,Yi)组成,表示朋友的编号分别为Xi,Yi。男人的编号是正数,女人的编号是负数。小明的编号是1,小红的编号是-1.

大家都知道,小明和小红是朋友,那么,请你写一个程序求出两公司之间,通过小明和小红认识的人最多一共能配成多少对情侣。(包括他们自己)

输入格式

第1行,4个空格隔开的正整数N,M,P,Q。

之后P行,每行两个正整数Xi,Yi。

之后Q行,每行两个负整数Xi,Yi。

输出格式

一行,一个正整数,表示通过小明和小红认识的人最多一共能配成多少对情侣。(包括他们自己)

输入输出样例

输入 #1
4 3 4 2
1 1
1 2
2 3
1 3
-1 -2
-3 -3
输出 #1
2

说明/提示

对于30%数据,N,M<=100,P,Q<=200

对于80%数据,N,M<=4000,P,Q<=10000.

对于全部数据,N,M<=10000,P,Q<=20000。

 题解:就求男生有多少个和1认识,女生有多少人和-1认识,然后整合一下
            取两者直接取小的即可。(毕竟不可一夫多妻或一妻多夫hhh)
 
#include<iostream>
#include<algorithm>
#include<queue>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<cstdio>
using namespace std;

const int N=20005;
int n,m,p,q,x,y,a1,a2;
int fa1[N],fa2[N],ans1,ans2;

int find1(int x){
   if(fa1[x]==x) return x;
   return fa1[x]=find1(fa1[x]);
}
int find2(int x){
   if(fa2[x]==x) return x;
   return fa2[x]=find2(fa2[x]);
}

int main(){
   
    scanf("%d %d %d %d",&n,&m,&p,&q);
    
    for(int i=1;i<=n;i++) fa1[i]=i;
    for(int i=1;i<=m;i++) fa2[i]=i;
    
    for(int i=1;i<=p;i++){
        scanf("%d %d",&x,&y);
        a1=find1(x); a2=find1(y);
        if(a1!=a2) fa1[a2]=a1;
    }
    for(int i=1;i<=q;i++){
        scanf("%d %d",&x,&y);
        x=-x; y=-y;
        a1=find2(x); a2=find2(y);
        if(a1!=a2) fa2[a2]=a1;
    }
    
    for(int i=1;i<=n;i++)
        if(find1(i)==find1(1)) ans1++;
    for(int i=1;i<=m;i++)
        if(find2(i)==find2(1)) ans2++;
        
    printf("%d",min(ans1,ans2));
    return 0;
}
原文地址:https://www.cnblogs.com/wuhu-JJJ/p/11503917.html