您的位置:首页 > 其它

tyvj微子危机——建造

2014-03-12 23:34 148 查看
http://www.tyvj.cn/Problem_Show.aspx?id=1220

和食物链差不多,把行列拆开 ,合并行列所对应的集合。最后统计有价值的行列 最后并成多少个集合

#include<stdio.h>
int father[200005],value[200005],b1[200005];
int getfather(int x)
{
if(x!=father[x])
father[x]=getfather(father[x]);
return father[x];
}

void add(int a,int b)
{
int fa=getfather(a); int fb=getfather(b);
if(fa!=fb)
father[fb]=fa;
}

int main()
{
int i,m,n,k,a,b,ans=0;
scanf("%d%d%d",&n,&m,&k);
memset(value,0,sizeof(value));
memset(b1,0,sizeof(b1));
for(i=1;i<=m+n;i++)
father[i]=i;
for(i=1;i<=k;i++)
{
scanf("%d%d",&a,&b);
b+=n;
value[a]=1;value[b]=1; add(a,b);
}
for(i=1;i<=n+m;i++)
{
if(value[i]) b1[getfather(i)]=1;
}
for(i=1;i<=n+m;i++) if(b1[i]) ans++;
printf("%d\n",ans-1);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: