给出n个点和m条边,一条一条地删除边,问每次删除以后有多少个联通块。
分析:其实就是并查集的应用,只是前一阵子一直做图论思路一直囿于tarjan了。。方法就是,记录每一条边,然后从最后一条边开始不断的加边,如果用并查集来判断联通块有没有减少即可。
代码如下:
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <set>
using namespace std;
typedef pair<int,int> pii; int root[+],ans[+];
pii edges[+];
int findroot(int x) {return x==root[x]?x:root[x]=findroot(root[x]);} int main()
{
int n,m;
while(scanf("%d%d",&n,&m)==)
{
int sum = n;
for(int i=;i<n;i++) root[i]=i;
for(int i=;i<m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
edges[i]=pii(u,v);
} for(int i=m-;i>=;i--)
{
ans[i] = sum;
int u = edges[i].first,v=edges[i].second;
int x = findroot(u),y = findroot(v);
if(x != y)
{
root[x] = y;
sum --;
}
}
for(int i=;i<m;i++)
{
printf("%d\n",ans[i]);
}
}
return ;
}