HDU 1213(裸並查集)(無變形)
阿新 • • 發佈:2018-06-11
line table #define The mar .cn tput KS ast
One important rule for this problem is that if I tell you A knows B, and B knows C, that means A, B, C know each other, so they can stay in one table.
For example: If I tell you A knows B, B knows C, and D knows E, so A, B, C can stay in one table, and D, E have to stay in the other one. So Ignatius needs 2 tables at least.
Input
The input starts with an integer T(1<=T<=25) which indicate the number of test cases. Then T test cases follow. Each test case starts with two integers N and M(1<=N,M<=1000). N indicates the number of friends, the friends are marked from 1 to N. Then M lines follow. Each line consists of two integers A and B(A!=B), that means friend A and friend B know each other. There will be a blank line between two cases.
Output
For each test case, just output how many tables Ignatius needs at least. Do NOT print any blanks.
題目鏈接:
http://acm.hdu.edu.cn/showproblem.php?pid=1213
How Many Tables
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 41546 Accepted Submission(s): 20798
One important rule for this problem is that if I tell you A knows B, and B knows C, that means A, B, C know each other, so they can stay in one table.
For example: If I tell you A knows B, B knows C, and D knows E, so A, B, C can stay in one table, and D, E have to stay in the other one. So Ignatius needs 2 tables at least.
Sample Input 2 5 3 1 2 2 3 4 5 5 1 2 5
Sample Output 2 4
Author Ignatius.L
Source 杭電ACM省賽集訓隊選拔賽之熱身賽 代碼如下:
#include<stdio.h> #include<iostream> using namespacestd; #define max_v 50005 int pa[max_v];//pa[x] 表示x的父節點 int rk[max_v];//rk[x] 表示以x為根結點的樹的高度 int n,ans; void make_set(int x) { pa[x]=x; rk[x]=0;//一開始每個節點的父節點都是自己 } int find_set(int x)//帶路徑壓縮的查找 { if(x!=pa[x]) pa[x]=find_set(pa[x]); return pa[x]; } void union_set(int x,int y) { x=find_set(x);//找到x的根結點 y=find_set(y); if(x==y)//根結點相同 同一棵樹 return ; ans--; if(rk[x]>rk[y]) { pa[y]=x; } else { pa[x]=y; if(rk[x]==rk[y]) rk[y]++; } } int main() { int T; scanf("%d",&T); while(T--) { int n,m; scanf("%d %d",&n,&m); if(m+n==0) break; for(int i=1; i<=n; i++) { make_set(i); } ans=n; for(int i=0; i<m; i++) { int x,y; scanf("%d %d",&x,&y); union_set(x,y); } printf("%d\n",ans); } return 0; }
HDU 1213(裸並查集)(無變形)