hdu1232: http://acm.hdu.edu.cn/showproblem.php?pid=1232
题意:给几条边(可能重复给),求至少还需几条边能使各点直接或者间接联系
解法:并查集:把已知的有联系的边减掉。
code:
#include<iostream>
#include<cstdio>
#include<cstdlib>
int fa[1005],n,m;
void solve(int a,int b)
{
for(int i=1;i<=n;i++)
if(fa[i]==a)
fa[i]=b;
}
int main()
{
int ans,a,b;
while(1)
{
scanf("%d",&n);
if(n==0)break;
for(int i=1;i<=n;i++)
fa[i]=i;
scanf("%d",&m);ans=n-1; //n个节点的最小生成树的边数为n-1
for(int i=0;i<m;i++)
{
scanf("%d%d",&a,&b);
if(fa[a]!=fa[b])
{
solve(fa[b],fa[a]);
ans--;
}
}
printf("%d\n",ans);
}
}
/*input:
4 2
1 3
4 3
3 3
1 2
1 3
2 3
5 2
1 2
3 5
999 0
0
output:
1
0
2
998*/