Problem Description

Luxer is a really bad guy. He destroys everything he met. 

One day Luxer went to D-city. D-city has N D-points and M D-lines. Each D-line connects exactly two D-points. Luxer will destroy all the D-lines. The mayor of D-city wants to know how many connected blocks of D-city left after Luxer destroying the first K D-lines in the input. 

Two points are in the same connected blocks if and only if they connect to each other directly or indirectly.

Input

First line of the input contains two integers N and M. 

Then following M lines each containing 2 space-separated integers u and v, which denotes an D-line. 

Constraints: 

0 < N <= 10000 

0 < M <= 100000 

0 <= u, v < N.

Output

Output M lines, the ith line is the answer after deleting the first i edges in the input.

Sample Input

5 10 0 1 1 2 1 3 1 4 0 2 2 3 0 4 0 3 3 4 2 4

Sample Output

1 1 1 2 2 2 2 3 4 5

Hint

The graph given in sample input is a complete graph, that each pair of vertex has an edge connecting them, so there's only 1 connected block at first. The first 3 lines of output are 1s because after deleting the first 3 edges of the graph, all vertexes still connected together. But after deleting the first 4 edges of the graph, vertex 1 will be disconnected with other vertex, and it became an independent connected block. Continue deleting edges the disconnected blocks increased and finally it will became the number of vertex, so the last output should always be N.

题意:这个小家伙每次删除一条边(初始时每对节点间都有边相连),问每次删除一条边后有几个联通块。

思路:比较基础的并查集应用,不明白的可以看这篇博客并查集 ,并查集是相连在一起,这题需要反着来,不断加边,用数组记录下联通块的数量,最后输出即可。

#include<cstdio>
#include<cstring>
#include <iostream>
#include<algorithm>
using namespace std;
const int N=10005;
const int M=100005;
int pre[N],r[N],s[M];
int n,m;
struct node
{
int x,y;
}a[M];
void init(int n)
{
for(int i = 0;i < n;++i)
{
pre[i]=i;
r[i]=0;
}
} int findpre(int x)
{
if(pre[x] == x)
return x;
return pre[x] = findpre(pre[x]);
} void join(int x,int y)
{
x = findpre(x);
y = findpre(y);
if(x == y)
return;
if(r[x] < r[y])
pre[x] = y;
else
{
pre[y] = x;
if(r[x] == r[y])
r[x]++;
}
} bool same(int x,int y)
{
return findpre(x) == findpre(y);
} int main()
{
while(~scanf("%d%d",&n,&m))
{
for(int i = 0; i < m; ++i)
scanf("%d%d",&a[i].x,&a[i].y);
init(n);
int ans = n;
for(int i = m-1; i >= 0; --i)
{
s[i] = ans;
if(!same(a[i].x,a[i].y))
--ans;
join(a[i].x,a[i].y);
}
for(int i = 0; i < m; ++i)
printf("%d\n",s[i]);
}
return 0;
}

HDU4496 D-City【基础并查集】的更多相关文章

  1. hdu 1829 基础并查集,查同性恋

    A Bug's Life Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...

  2. poj-2236 Wireless Network &&poj-1611 The Suspects && poj-2524 Ubiquitous Religions (基础并查集)

    http://poj.org/problem?id=2236 由于发生了地震,有关组织组把一圈电脑一个无线网,但是由于余震的破坏,所有的电脑都被损坏,随着电脑一个个被修好,无线网也逐步恢复工作,但是由 ...

  3. AOJ 2170 Marked Ancestor (基础并查集)

    http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=45522 给定一棵树的n个节点,每个节点标号在1到n之间,1是树的根节点,有如 ...

  4. poj2236 基础并查集

    题目链接:http://poj.org/problem?id=2236 题目大意:城市网络由n台电脑组成,因地震全部瘫痪,现在进行修复,规定距离小于等于d的电脑修复之后是可以直接相连 进行若干操作,O ...

  5. 基础并查集poj2236

    An earthquake takes place in Southeast Asia. The ACM (Asia Cooperated Medical team) have set up a wi ...

  6. HDU - 4496 City 逆向并查集

    思路:逆向并查集,逆向加入每一条边即可.在获取联通块数量的时候,直接判断新加入的边是否合并了两个集合,如果合并了说明联通块会减少一个,否则不变. AC代码 #include <cstdio> ...

  7. CodeForces - 827A:String Reconstruction (基础并查集)

    Ivan had string s consisting of small English letters. However, his friend Julia decided to make fun ...

  8. hdu1325 Is It A Tree? 基础并查集

    #include <stdio.h> #include <string.h> ], g[]; int find(int x) //并查集的查找,找到共同的父亲 { if (f[ ...

  9. HDU1213How Many Tables(基础并查集)

    HDU1213How Many Tables Problem Description Today is Ignatius' birthday. He invites a lot of friends. ...

随机推荐

  1. HDU 5976 Detachment 【贪心】 (2016ACM/ICPC亚洲区大连站)

    Detachment Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  2. sql server 生成随机数 rand函数

    https://docs.microsoft.com/en-us/sql/t-sql/functions/rand-transact-sql?view=sql-server-2017 在某一个区间内生 ...

  3. 安装完Anaconda python 3.7,想使用python3.6方法

    cmd使用命令: conda create -n py36 python=3.6 anaconda 安装好后,会有提示: To activate this environment, use:# > ...

  4. ImportError: No module named flask.ext.login

    from flask.ext.login import current_user python 3.x中,上面代码会报错:ImportError: No module named flask.ext. ...

  5. POJ1808 平方(二次)同余方程

    POJ1808  给定一个方程 x*x==a(mod p) 其中p为质数 判断是否有解 程序中 MOD_sqr()返回整数解 无解返回-1 数学证明略 #include<iostream> ...

  6. Nginx配置try_files实践二

    本文内容承接<Nginx配置try_files实践一> 1. 环境: OS:Ubuntu 15.10 nginx:nginx/1.9.3 (Ubuntu) 假设有三台虚拟机db1(IP:1 ...

  7. 国际化------international

    1.配置web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi=& ...

  8. Windows下重置MySQL密码【MYSQL】

    使用环境:win10 x64企业版 关闭正在运行的MySQL服务. 打开DOS窗口,转到mysqlbin目录. 输入mysqld --skip-grant-tables回车.如果没有出现提示信息,那就 ...

  9. Java编程思想读书笔记_第6章(访问权限)

    四种访问权限: public private 包访问权限 protected 如果没有明确指定package,则属于默认包 package access.dessert; public class C ...

  10. UVM基础之------uvm phases机制

    代码的书写顺序会影响代码的实现,在不同的时间做不同的事情,这是UVM phase的设计哲学,UVM phase提供了一个通用的TB phase 解决方案.支持显示的隐式的同步方案,运行时刻的线程控制和 ...