为什么十分???

P2078 朋友

我也是! ···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


|