M.J的blog

algorithm,ACM-ICPC
随笔 - 39, 文章 - 11, 评论 - 20, 引用 - 0
数据加载中……

TOJ 2469. Friends【并查集】

并查集或者DFS的题,大概是说有N个学生去订房间,只有朋友可以住一个房间。朋友关系具有传递性,如果A和B是朋友,B和C是朋友,那么A和C是朋友。问最后最少定多少个房间。
我用并查集做,却在最后犯了一个很不容易发觉的错误,最后还是找一个学姐才发现。看来以后一定得小心啊,太大意会很可怕的~
Code:
 1 #include<stdio.h>
 2 #include<string.h>
 3 struct student
 4 {
 5     int father,rank;
 6 }a[250];
 7 bool flag[250];
 8 void initial(int n)
 9 {
10     int i;
11     for(i=1;i<=n;i++){
12         a[i].father=i;
13         a[i].rank=1;
14     }
15 }
16 int find(int n)
17 {
18     while(a[n].father!=n)
19         n=a[n].father;
20     return n;  
21 }
22 void Union(int root1,int root2)
23 {
24     int t1,t2;
25     t1=find(root1);
26     t2=find(root2);
27     if(t1==t2) return ;
28     else{
29         if(a[t1].rank>a[t2].rank){
30             a[t2].father=t1;
31             a[t1].rank+=a[t2].rank;
32         }
33         else{
34             a[t1].father=t2;
35             a[t2].rank+=a[t1].rank;
36         }
37     }
38 }
39 int main()
40 {
41     int i,j,k,m,n,cas;
42     scanf("%d",&cas);
43     while(cas--){
44         scanf("%d%d",&n,&m);
45         initial(n);
46         for(i=1;i<=m;i++){
47             scanf("%d%d",&j,&k);
48             Union(j,k);
49         }
50         memset(flag,false,sizeof(flag));
51         k=0;
52         for(i=1;i<=n;i++){
53             if(!flag[find(i)]){
54                 k++;
55                 flag[find(i)]=true;
56             }
57         }
58         printf("%d\n",k);
59     }
60 }
61 

posted on 2010-04-30 22:38 M.J 阅读(329) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理