POJ-2524 并查集

来源:互联网 发布:小区网络方案 编辑:程序博客网 时间:2024/06/05 18:50

我不知道为什么都是并查集,有的300ms+,有的只用几十ms。希望有人能告诉我怎么能写到几十ms,希望这不是以牺牲代码的易读性为代价。

/* * ubiquitous religions * mike-w * 2012-4-27 * ******************************** * C代码一些表达式后面应该有空格 * 这样的代码格式看起来更方便 * int a,b,c,d,e; // bad * int a, b, c, d, e; // good */#include<stdio.h>#include<stdlib.h>#include<string.h>#define SET_SIZE 55555int set[SET_SIZE],rank[SET_SIZE];int N,M;int set_init(int size){int i;for(i=1; i<=size; i++)set[i]=i, rank[i]=1;return 0;}int set_find(int e){if(set[e] == e)return e;elsereturn set[e]= set_find(set[e]);}/* * 查考了一下《算法导论》,猛然发觉我的merge函数里一直有 * 不少废话==! */int set_merge(int e1, int e2){int r1=set_find(e1);int r2=set_find(e2);if(r1 == r2)return -1;if(rank[r1] < rank[r2])set[r1]=r2;else if(rank[r1] > rank[r2])set[r2]=r1;elseset[r1]=r2, rank[r2]++;return 0;}int main(void){#ifndef ONLINE_JUDGEfreopen("in","r",stdin);#endifint count,ccase=1;int i,t1,t2;while(scanf("%d%d",&N,&M),M||N){set_init(N);count=N;for(i=0;i<M;i++){scanf("%d%d",&t1,&t2);if(!set_merge(t1,t2))count--;}printf("Case %d: %d\n",ccase++,count);}return 0;}


原创粉丝点击