HDU 4496 D-City(并查集,逆思维)

题目

熟能生巧。。。常做这类题,就不会忘记他的思路了。。。

//可以反过来用并查集,还是逐个加边,但是反过来输出。。。我是白痴。。。。、又没想到
//G++能过,C++却wa,这个也好奇怪呀。。。 #include<stdio.h>
#include<string.h>
int fx,fy,r,bin[]; int x[],y[],n,m,i,count,ans[],j;
int find(int x)
{ //改成这样就不会超时了么好奇怪为什么
if(bin[x] == x)return x;
return bin[x] = find(bin[x]);
/*超时到哭,,,why?
r=x;
while(bin[r]!=r)
{
r=bin[r];
}
return r;
*/
}
void merge(int x,int y)
{
fx=find(x);
fy=find(y);
if(fx!=fy)
{
bin[fx]=fy;
ans[j]=ans[j-]+;
}
else
ans[j]=ans[j-];
j++;
}
int main()
{
while(scanf("%d %d",&n,&m)!=EOF)
{
memset(ans,,sizeof(ans));
for(i=;i<n;i++)
{
bin[i]=i;
}
for(i=;i<m;i++)
{
scanf("%d %d",&x[i],&y[i]);
}
j=;
for(i=m-;i>=;i--)
{
merge(x[i],y[i]);
} for(i=j-;i>=;i--)
printf("%d\n",n-ans[i]);
printf("%d\n",n);
}
return ;
}
上一篇:Mac OS 10.10 Yosemite正式版怎么升级 升级教程


下一篇:webpack 处理css兼容问题