标签: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