我也是!
···cpp
```cpp
```
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<cmath>
#include<stdlib.h>
#define INF 0x3f3f3f3f
#define MAXN 20001
using namespace std;
int f[MAXN];
int n,m,p,q;
int boy=0,girl=0;
int find(int x)
{
if (f[x]==x)
return x;
f[x]=find(f[x]);
return f[x];
}
void add(int a,int b)
{
int fa=find(a),fb=find(b);
if (fa!=fb)
f[fa]=fb;
return;
}
bool query(int a,int b)
{
int fa=find(a),fb=find(b);
if (fa==fb)
return 1;
return 0;
}
int main()
{
scanf("%d%d%d%d",&n,&m,&p,&q);
for (int i=1;i<=n;i++)
f[i]=i;
for (int i=1;i<=p;i++)
{
int a,b;
scanf("%d%d",&a,&b);
add(a,b);
}
for (int i=2;i<=n;i++)
if (query(i,1))
boy++;
for (int i=1;i<=m;i++)
f[i]=i;
for (int i=1;i<=q;i++)
{
int a,b;
scanf("%d%d",&a,&b);
a=abs(a),b=abs(b);
add(a,b);
}
for (int i=2;i<=n;i++)
{
if (query(i,1))
girl++;
}
printf("%d\n",max(boy,girl));
return 0;
}
这是我的程序,哪位大佬顺便帮忙看一下我的,谢谢!
```cpp
by KonnyakuZeri @ 2017-08-08 18:25:45
额,格式又乱了,如下
```cpp
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<cmath>
#include<stdlib.h>
#define INF 0x3f3f3f3f
#define MAXN 20001
using namespace std;
int f[MAXN];
int n,m,p,q;
int boy=0,girl=0;
int find(int x)
{
if (f[x]==x)
return x;
f[x]=find(f[x]);
return f[x];
}
void add(int a,int b)
{
int fa=find(a),fb=find(b);
if (fa!=fb)
f[fa]=fb;
return;
}
bool query(int a,int b)
{
int fa=find(a),fb=find(b);
if (fa==fb)
return 1;
return 0;
}
int main()
{
scanf("%d%d%d%d",&n,&m,&p,&q);
for (int i=1;i<=n;i++)
f[i]=i;
for (int i=1;i<=p;i++)
{
int a,b;
scanf("%d%d",&a,&b);
add(a,b);
}
for (int i=2;i<=n;i++)
if (query(i,1))
boy++;
for (int i=1;i<=m;i++)
f[i]=i;
for (int i=1;i<=q;i++)
{
int a,b;
scanf("%d%d",&a,&b);
a=abs(a),b=abs(b);
add(a,b);
}
for (int i=2;i<=n;i++)
{
if (query(i,1))
girl++;
}
printf("%d\n",max(boy,girl));
return 0;
}
```
by KonnyakuZeri @ 2017-08-08 18:26:09
好吧,现在成50分了
```cpp
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<cmath>
#include<stdlib.h>
#define INF 0x3f3f3f3f
#define MAXN 20001
using namespace std;
int f[MAXN];
int n,m,p,q;
int boy=0,girl=0;
int find(int x)
{
if (f[x]==x)
return x;
f[x]=find(f[x]);
return f[x];
}
void add(int a,int b)
{
int fa=find(a),fb=find(b);
if (fa!=fb)
f[fa]=fb;
return;
}
bool query(int a,int b)
{
int fa=find(a),fb=find(b);
if (fa==fb)
return 1;
return 0;
}
int main()
{
scanf("%d%d%d%d",&n,&m,&p,&q);
for (int i=1;i<=n;i++)
f[i]=i;
for (int i=1;i<=p;i++)
{
int a,b;
scanf("%d%d",&a,&b);
add(a,b);
}
for (int i=1;i<=n;i++)
if (query(i,1))
boy++;
for (int i=1;i<=m;i++)
f[i]=i;
for (int i=1;i<=q;i++)
{
int a,b;
scanf("%d%d",&a,&b);
a=abs(a),b=abs(b);
add(a,b);
}
for (int i=1;i<=n;i++)
if (query(i,1))
girl++;
printf("%d\n",min(boy,girl));
return 0;
}
```
这是新程序
老程序的问题:
①像我这样从2开始“找朋友”,boy、girl都要赋值成1,或者干脆从1开始找
②输出是min,不是max!!!!(当时脑抽了)
现在不知道另外50分又被那个错误吃了。望大佬指正!
by KonnyakuZeri @ 2017-08-08 18:40:19
@[oycy0306](/space/show?uid=16842) 我个人觉得用两个并查集做就好了
by 编程的弱子 @ 2017-08-28 21:32:28
本人初学并查集,所以算法能AC但自我感觉还是做复杂了,欢迎有更好的做法
```cpp
#include<bits/stdc++.h>
#define maxn 10001
using namespace std;
int a[maxn],b[maxn];
int find1(int x) //找男孩
{ if (x==a[x]) return x;
a[x]=find1(a[x]);
return a[x];
}
int find2(int x) //找女孩
{ if (x==b[x]) return x;
b[x]=find2(b[x]);
return b[x];
}
void merge1(int x,int y) //合并男孩集合
{ int m,n;
m=find1(x);
n=find1(y);
if (m==n) return;
a[m]=n;
}
void merge2(int x,int y) //合并女孩集合
{ int m,n;
m=find2(x);
n=find2(y);
if (m==n) return;
b[m]=n;
}
int main()
{int n,m,p,q,i,j,x,y;
cin>>n>>m>>p>>q;
for (i=1;i<=n;i++)
a[i]=i;
for (j=1;j<=m;j++)
b[j]=j;
for (i=1;i<=p;i++)
{scanf("%d%d",&x,&y);
merge1(x,y);
}
for (j=1;j<=q;j++)
{scanf("%d%d",&x,&y);
merge2(abs(x),abs(y));
}
x=find1(1);
y=find2(1);
a[0]=1;
b[0]=1;
for (i=2;i<=n;i++)
if (find1(a[i])==x)
a[0]++; //这里是找到与a[1]认识的男孩数
for (i=2;i<=m;i++)
if (find2(b[i])==y)
b[0]++; //这里是找到与b[1]认识的女孩数
cout<<min(a[0],b[0])<<endl; 最后输出较小的那个就好了
return 0;
}
```
by 编程的弱子 @ 2017-08-28 21:36:56
me too
by 脑残智障 @ 2018-08-19 08:44:14