cf500-D

链接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 }

弱的直咳嗽

原文地址:https://www.cnblogs.com/3532gll/p/9418805.html