hdu4496 并查集
来源:互联网 发布:删除cadbak文件软件 编辑:程序博客网 时间:2024/06/06 00:00
题意:给定一个图,N个点,M条边,先把给定的M个连成图,然后反过来从第1个开始顺序到M个删边后剩下的多少联通块。
思路:其实我们可以逆向思考,从第M个开始,到第一个依次加边,这样就是相当于简单的并查集了;
代码:
#include<stdio.h>int a[10005],reg[10005];int find(int tt){ if(tt!=a[tt]) a[tt]=find(a[tt]); return a[tt];}void sort(int dx,int dy)//这个函数其实是把在同一个连通块的点指向同一个根节点,用于后面判断;reg函数记录的是点所在连通块点的数目;{ int sx=find(dx); int sy=find(dy); if(sx==sy) return; if(reg[sx]<reg[sy]) { a[sx]=sy; reg[sy]+=reg[sx]; reg[sx]=0; } else { a[sy]=sx; reg[sx]+=reg[sy]; reg[sy]=0; }}int main(){ int n,m; while(~scanf("%d%d",&n,&m)) { int i,j,vis[100005],mag[100005]; int x[100005],y[100005]; for(i=1;i<=m;i++) scanf("%d%d",&x[i],&y[i]); for(i=0;i<n;i++) { a[i]=i;reg[i]=1; mag[i]=1; //mag函数记录点是否访问过; } int s=n; for(i=m;i>=1;i--) { if(mag[x[i]]&&mag[y[i]]) s--; else if(mag[x[i]]||mag[y[i]]) s--; else if(find(x[i])!=find(y[i]))//给出的两个点如果都访问过,则判断根节点是否相同; s--; sort(x[i],y[i]); mag[x[i]]=0; mag[y[i]]=0; vis[i]=s; } for(i=2;i<=m;i++) printf("%d\n",vis[i]); printf("%d\n",n); }}
0 0
- 并查集HDU4496
- HDU4496(并查集)
- hdu4496 并查集
- hdu4496(并查集)
- hdu4496--D.City(并查集)
- HDU4496 D-City【并查集】
- hdu4496 D-City 并查集
- hdu4496 D-City 并查集
- hdu4496 D-City 并查集
- hdu4496(并查集+逆向思维)
- hdu4496并查集的删边操作
- HDU4496 D-City并查集逆向推理
- HDU4496 D-City(并查集逆向思维)
- HDU4496(并差集)
- 并查集:HDU4496-D-City(倒用并查集)
- hdu4496 D-City(并查集删边)
- HDU4496
- hdu4496
- 产生n位元的所有格雷码。
- 第五周项目1——(1)三角形类雏形
- MATLAB/c++混合编程
- wget完成ftp链接下载
- finalize()方法什么时候被调用?析构函数(finalization)的目的是什么?
- hdu4496 并查集
- 点击文本可选中选择框
- 1007 of greedy strategy*
- java--自定义标签(tag、tld两种)
- mybatis第2天
- POJ 3678 Katu Puzzle 2-SAT
- JVM(一)--概述
- 按订单号(String常量池唯一,即对象唯一)加同步锁
- leetcode: Next Permutation