首页 > 代码库 > HDU 4496 D-City (并查集)
HDU 4496 D-City (并查集)
题意:给你n个点m条边,问删除前i条边后有多少个连通分块。
思路:从后往前操作,从后往前添加i条边等于添加完m条边后删掉前m-i条边,可知刚开始没有边,所以sum[m]=n;
#include <stdio.h> #include <iostream> #include <algorithm> #include <string.h> #include <queue> #include <math.h> #define M 100010 #define LL long long using namespace std; int n,m; int father[M]; int find(int x) { if(x!=father[x]) return father[x]=find(father[x]); return x; } int sum[M]; int main() { while(~scanf("%d%d",&n,&m)) { int a[M],b[M]; for(int i=0;i<=n;i++) father[i]=i; for(int i=1;i<=m;i++) scanf("%d%d",&a[i],&b[i]); sum[m]=n; for(int i=m;i>0;i--) { if(find(a[i])!=find(b[i])) { sum[i-1]=sum[i]-1; father[find(a[i])]=find(b[i]); } else sum[i-1]=sum[i]; } for(int i=1;i<=m;i++) { printf("%d\n",sum[i]); } } return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。