并查集的应用,用来查找被分割的区域个数。
即当两个节点值相同时说明已经为了一个圈,否则不可能,此时区域个数加1.
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 const int maxn=1010; 6 int n,m; 7 int root[maxn]; 8 9 int find(int a){ 10 while(root[a]!=a){ 11 a=root[a]; 12 } 13 return a; 14 } 15 16 int main(){ 17 while(EOF != scanf("%d%d",&n,&m)){ 18 for(int i=0;i<n;i++){ 19 root[i]=i; 20 } 21 int ans = 0; 22 int a,b; 23 while(m--){ 24 scanf("%d%d",&a,&b); 25 int ra=find(a); 26 int rb=find(b); 27 if(ra == rb) 28 ans++; 29 else 30 root[ra]=rb;//epual to Join 31 //printf("%d %d %d ",ra,rb,ans); 32 } 33 printf("%d ",ans); 34 } 35 return 0; 36 }
Ice_cream's world I
Time Limit : 3000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 3 Accepted Submission(s) : 2
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
ice_cream's world is a rich country, it has many fertile lands. Today, the queen of ice_cream wants award land to diligent ACMers. So there are some watchtowers are set up, and wall between watchtowers be build, in order to partition the ice_cream’s world. But how many ACMers at most can be awarded by the queen is a big problem. One wall-surrounded land must be given to only one ACMer and no walls are crossed, if you can help the queen solve this problem, you will be get a land.
Input
In the case, first two integers N, M (N<=1000, M<=10000) is represent the number of watchtower and the number of wall. The watchtower numbered from 0 to N-1. Next following M lines, every line contain two integers A, B mean between A and B has a wall(A and B are distinct). Terminate by end of file.
Output
Output the maximum number of ACMers who will be awarded.
One answer one line.
One answer one line.
Sample Input
8 10 0 1 1 2 1 3 2 4 3 4 0 5 5 6 6 7 3 6 4 7
Sample Output
3