HDU4496
来源:互联网 发布:dota2怎么刷暴走数据 编辑:程序博客网 时间:2024/06/01 20:06
HDU4496 D-CITY(并查集)
题目描述:给出一个有N(0<N<=10000)个顶点的无向图,然后依次给出它的M(0<M<=100000)条边,要求依次输出当删除给出的前k(0<K<=M)条边后,该图的连通分量总数。
输入:第一行是N和M,然后是M行数(X,Y)(0<=X,Y<N)表示X与Y有边。
输出:依次输出所求的连通分量数。
分析:当删除前K条边时图所剩的连通分量数就是N个孤立的点只添加后M-K跳边时,所具有的连通分量数。
所以仅需倒叙插入每条边,分别保存插入边后有的连通分量数在数组内,然后输出数组即可。
AC代码中未加while(scanf("%d%d",&n,&m)==2)这行而直接用scanf("%d%d",&n,&m);就得到wrong的结果。
#include<cstdio>using namespace std;int pa[10000+200];int x[100000+100],y[100000+100],sum[100000+100];int findset(int x){ return pa[x]==x?x:pa[x]=findset(pa[x]);}int main(){ int n,m; while(scanf("%d%d",&n,&m)==2) { for(int i=0; i<m; i++) scanf("%d%d",&x[i],&y[i]); for(int i=0; i<n; i++) pa[i]=i; sum[m-1]=n;//一条边都没有时的连通分量数 for(int i=m-1; i>=0; i--) //一次加上从m-1到0号的边 { int u=findset(x[i]),v=findset(y[i]); if(u!=v) { pa[u]=v; sum[i-1]=sum[i]-1;//sum[i]表删除前i号边(边从0开始计数到m-1)后剩的连通分量数 } else sum[i-1]=sum[i]; } for(int i=0; i<m; i++) printf("%d\n",sum[i]); } return 0;}
0 0
- HDU4496
- hdu4496
- hdu4496 D-City
- hdu4496 D-City
- 并查集HDU4496
- HDU4496(并查集)
- hdu4496 并查集
- HDU4496 D-City
- HDU4496(并差集)
- D-City(HDU4496)
- hdu4496(并查集)
- hdu4496 求连通分量个数
- hdu4496 D-City(并查集删边)
- hdu4496 D-City(反向并查集啊 )
- hdu4496--D.City(并查集)
- HDU4496 D-City【并查集】
- hdu4496 D-City 并查集
- hdu4496 D-City 并查集
- C#更新Oracle CLOB字段
- cocos2dx 没有“install-templates-msvc.bat” 创建工程
- 图片切割系统
- java中的构造方法详解
- Java多线程(五)之BlockingQueue深入分析
- HDU4496
- 页面只显示列名,不显示数据库里的数据
- Chrome学习笔记(一):线程模型,消息循环
- 我这些年走过的地方
- NSDictionary转换成json格式的数据
- Android 传感器应用开发
- C++标准库 之 读入输出的方法
- Oracel 锁的相关知识(解锁)
- 10 个你需要了解的 Linux 网络和监控命令