您的位置:首页 > 其它

ZOJ 1789 The Suspects

2014-04-20 10:06 274 查看
与2833差不多

基本上只是merge函数那里的优先做父亲的条件改一下便可提高效率...

//The Suspects
#include<cstdio>
#include<memory.h>
int parent[30001];
int find(int i)
{
while(parent[i] >= 0)
i = parent[i];
return i;
}
void merge(int a,int b)
{
int c = find(a);
int d = find(b);
int temp = parent[c] + parent[d];
if(c != d)
{
if(d < c)//d的根小于c,d做父亲。。。因为0是感染者,这样建立查找时有效率
{
parent[c] = d;
parent[d] = temp;
}
else
{
parent[d] = c;
parent[c] = temp;
}
}
}
int main()
{
//freopen("input.txt","r",stdin);
int n,m;
int k,a,b;
while(scanf("%d%d",&n,&m) && n)//这里不能scanf("%d%d",&n,&m) && n && m) 因为m为0时同样可以
{
memset(parent,-1,sizeof(parent));
while(m--)
{
scanf("%d",&k);
scanf("%d",&a);
k--;
while(k--)
{
scanf("%d",&b);
merge(a,b);
}

}
printf("%d\n",-parent[0]);
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: