标签:lists init div spi break find rank uniq sum
| Time Limit: 1000MS | Memory Limit: 20000K | |
| Total Submissions: 23002 | Accepted: 11171 | 
Description
Input
Output
Sample Input
100 4 2 1 2 5 10 13 11 12 14 2 0 1 2 99 2 200 2 1 5 5 1 2 3 4 5 1 0 0 0
Sample Output
4 1 1
提交一直出现Wrong Answer,主要代码出错在union_set方法。
之前
void union_set(int x,int y){
	x = find_set(x);
	y = find_set(y);
	if(rank[x] >  rank[y]){
		pa[y] = x;
		count[x] += count[y];
	}
	else{
		pa[x] = y;
		if(rank[x] == rank[y]){
			rank[y]++;
		}
		count[y] += count[x];
	}
}
修改为
void union_set(int x,int y){
	x = find_set(x);
	y = find_set(y);
	if(x==y) return;	
	if(rank[x] > rank[y])
	{
		pa[y] = x;
		count[x] += count[y];
		rank[x]++;
	}
	else
	{
		pa[x] = y;
		rank[y]++;
		count[y] += count[x];
	}
}
通过了
#include <cstdio>
const int MAXN = 30001;
int pa[MAXN];
int rank[MAXN];
int count[MAXN];
void make_set(int x){
	pa[x] = x;
	rank[x] = 0;
	count[x] = 1;
}
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);
	y = find_set(y);
	if(x==y) return;	
	if(rank[x] > rank[y])
	{
		pa[y] = x;
		count[x] += count[y];
		rank[x]++;
	}
	else
	{
		pa[x] = y;
		rank[y]++;
		count[y] += count[x];
	}
}
int main(void){
	int n,m;
	while(1){
		int i;
		scanf("%d%d",&n,&m);
		if(0==n && 0==m){
			break;
		}
		for(i=0;i<n;i++){
			make_set(i);
		}
		for(i=0;i<m;i++){
			int k,first,j;
			scanf("%d%d",&k,&first);
			for(j=1;j<k;j++){
				int next;
				scanf("%d",&next);
				union_set(first,next);
			}
		}
		int p = find_set(0);
		printf("%d\n",count[p]);
	}
	return 0;
}
标签:lists init div spi break find rank uniq sum
原文地址:http://www.cnblogs.com/zhaohongtian/p/6809016.html