您的位置:首页 > 其它

hdu 4496 D-City

2015-10-18 20:35 288 查看
并查集水题,给你一张图,问你删掉前I条边之后联通块的个数,倒着合并就可以了

#include<iostream>
#define maxn 10010
using namespace std;
int f[maxn];
struct stu
{
int a,b;
};
stu mapp[maxn*10];
int re[maxn*10];
int n,m;
int dfs(int x)
{
if(f[x]!=x) f[x]=dfs(f[x]);
return f[x];
}
int main()
{
cin.sync_with_stdio(false);
while(cin>>n>>m)
{
for(int i=0;i<m;i++) cin>>mapp[i].a>>mapp[i].b;
for(int i=0;i<=n;i++) f[i]=i;
re[m]=n;
int sum=n;
for(int i=m-1;i>=0;i--)
{
int x=dfs(mapp[i].a);
int y=dfs(mapp[i].b);
if(x!=y)
{
f[x]=y;
sum--;
}
re[i]=sum;
}
for(int i=1;i<=m;i++) cout<<re[i]<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: