题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4496
题目描述:问毁坏K条边后还有几堆?
解题思路:
还是并查集,反过来做就行了,坑的是这题竟然是EOF输入,它又没说!
然后我还是WA了几下,因为不能每次都遍历查有多少堆,那样会超时,像改完的代码里那样用个Num计数就行了。
这种计数方式应该记着点,可能挺有用的、
AC代码:
#include <iostream>
#include <cstdio>
using namespace std;
int arr[10050],from[100050],to[100050],ans[100050];
int N,M;
int find_father(int x)
{
return arr[x]==x?x:arr[x]=find_father(arr[x]);
}
int main()
{
while(scanf("%d%d",&N,&M)!=EOF)
{
int i,j,q=0,num;
num=N;
ans[q]=num;
for(i=0;i<=N;i++)
arr[i]=i;
for(i=0;i<M;i++)
scanf("%d%d",&from[i],&to[i]);
for(i=M-1;i>=0;i--)
{
int fa,fb;
fa=find_father(from[i]);
fb=find_father(to[i]);
if(fa!=fb)
{
arr[fa]=fb;
num--;
}
ans[++q]=num;
}
for(i=q-1;i>=0;i--)
printf("%d\n",ans[i]);
}
return 0;
}
AC截图: