链接http://codeforces.com/contest/1013/problem/D
对于此题,最难处其实是,通过读了题面,你是如何知道,要用并查集的。
我第一眼看到,觉得是搜索题,后来一想,实在没思路,真的也太弱了。
直接代码:
1 #include<bits/stdc++.h> 2 /*#include<iostream> 3 #include<cstdio> 4 #include<string>*/ 5 #define maxn 400010 6 using namespace std; 7 int pre[maxn]; 8 9 int find(int x){ 10 if(pre[x]==x) return x; 11 return pre[x]=find(pre[x]); 12 } 13 14 int main(){ 15 int n,m,edge; 16 int x,y; 17 cin>>n>>m>>edge; 18 for(int i=1;i<=n+m;i++) pre[i]=i; 19 int sum=0; 20 for(int i=0;i<edge;i++){ 21 scanf("%d%d",&x,&y); 22 if(find(x)!=find(y+n)) //为什么是y+n,因为我们目的是要去构建很多的几何,那些在一起的集合并在一起,所以比如,3x4有个(2,2),属于2,5集合。 23 { 24 pre[find(x)]=find(y+n); 25 sum++; 26 } 27 } 28 cout<<n+m-sum-1<<endl; 29 }
弱的直咳嗽