依旧简单并查集,拿1611火速改了改火速提交,果断PE...把输出的最后一个空格放%d前面了,真活该不运行就交。
但是这题有个疑问,为什么按秩合并没有比直接合并快??
code:
#include<cstdio> int p[ 50005], r[ 50005] ; void make_set( int n){ for( int i= 0; i<n; i++){ p[i] = i ; r[i] = 0 ; } } int find_set( int x){ if(x!=p[x]) p[x] = find_set(p[x]) ; return p[x] ; } void union_set( int x, int y){ x = find_set(x) ; y = find_set(y) ; if(x!=y){ if(r[x]>r[y]) p[y] = x ; else{ p[x] = y ; if(r[x]==r[y]) r[x] ++ ; } } } int main(){ int n, m, i, x, y, sum, t= 0 ; while(~scanf( " %d%d ", &n, &m)&&(n+m)){ t ++ ; make_set(n) ; while(m--){ scanf( " %d ", &x) ; scanf( " %d ", &y) ; union_set(x, y) ; } sum = 0 ; for(i= 0; i<n; i++) if(i==find_set(i)) sum ++ ; printf( " Case %d: %d\n ", t, sum) ; } return 0 ;
}