今早看到数据结构课本上有并查集,只是名字变了,MFSet(初步认为是MergeFindSet,大概就是并查集的英文名).恍然大悟,原来课本上也有好东西啊~中午回到寝室赶忙用二十分钟做了一道基础题,ac.现在把代码放上来纪念一下~
- #include <stdio.h>
- int FindDad(int *parent,int b)
- {
- int a(b);
- // 找出最高的祖宗
- while( parent[a] != a)
- a = parent[a];
- /*
- // 对集合进行压缩
- int c;
- while(parent[b] != a) {
- c = parent[b];
- parent[b] = a;
- b = c;
- }
- */
- return a;
- }
- void MergeSet(int *parent,int a,int b)
- {
- int t1 = FindDad(parent,a);
- int t2 = FindDad(parent,b);
- //很俗地用比较大的做根
- if( t1 > t2)
- parent[t2] = t1;
- else
- parent[t1] = t2;
- }
- int main()
- {
- int parent[50005];
- int m, n;
- int count,time = 1;
- int t1,t2;
- scanf("%d%d",&n,&m);
- while( n) {
- count = 0;
- for( int i = 1; i <= n; i++)
- parent[i] = i;
- //合并集合
- for( int i = 0; i < m; i++) {
- scanf("%d%d",&t1,&t2);
- MergeSet(parent,t1,t2);
- }
- //查找集合个数
- for( int i =1; i <= n; i++)
- if( parent[i] == i)
- count ++;
- printf("Case %d: %d/n",time++,count);
- scanf("%d%d",&n,&m);
- }
- return 0;
- }
后来在波波怂恿下尝试压缩,发现时间不减反增...可能是压缩的时机不对吧,晚些补上优化版.