您的位置:首页 > 其它

POJ 1611 The Suspects (并查集)

2015-07-31 19:37 375 查看
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int vis_tuan[500+10];
int vis[30000+10];
int mat[30000+10][510];
int fa[30000+10];
int ans;
int n,m;
int find(int x)
{
return fa[x]==x?x:find(fa[x]);
}

void bin(int x,int y)  //前小后大
{
int fx=find(x);
int fy=find(y);
if(fx!=fy)
{
// printf("x %d fx %d y %d fy %d\n",x,fx,y,fy);
// printf("%d %d\n",vis[fx],vis[fy]);

if(fy==0)
{
vis[fy]+=vis[fx];
fa[fx]=fa[fy];
}
else
{
vis[fx]+=vis[fy];
fa[fy]=fa[fx];
}
}
}

int main()
{

int i,j,k;
while(scanf("%d%d",&n,&m),n+m)
{
ans=0;
int ok=0;
//memset(vis_tuan,0,sizeof(vis_tuan));
memset(vis,0,sizeof(vis));

for(i=0;i<=n;i++)
{
vis[i]=1;
fa[i]=i;
}

for(i=0;i<m;i++)
{
scanf("%d",&mat[i][0]);
int tlen=mat[i][0];
for(j=1;j<=tlen;j++)
{
scanf("%d",&mat[i][j]);
if(mat[i][j]==0) ok=1;
}
sort(mat[i]+1,mat[i]+tlen+1);

for(j=2;j<=tlen;j++)
{
//printf("  %d ",mat[i][j]);
bin(mat[i][1],mat[i][j]);
}
//printf("\n");
}

printf("%d\n",vis[0]);

/*if(ok==1)
{
int ret=0;
for(i=0;i<n;i++)
{
if(find(i)==0) ret++;
}
printf("%d\n",ret);
}
else
printf("0\n");*/
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: