点击打开链接

D.D-City

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





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.

反向其实就是一个并查集的合并操作,。听说正向BFS可破,但是没试过

#include<stdio.h>
#include<string.h>
int dele[100010][2];
int father[10010];
int mystack[100010];
int top;
int count;
int getfather(int i)
{
if(father[i] == i)
return i;
else
return father[i] = getfather(father[i]);
}
void merge(int a, int b)
{
a = getfather(a);
b = getfather(b);
if(a == b)
return;
else
{
father[b] = a;
count --;
}
}
int main()
{
int n, m;
while(scanf("%d%d", &n, &m) != EOF)
{
int i;
memset(dele, 0, sizeof(dele));
for(i = 0; i < m; i++)
father[i] = i;
for(i = 0; i < m ; i++)
scanf("%d%d", &dele[i][0], &dele[i][1]);
count = n;
top = 0;
for(i--; i >= 0; i --)
{
mystack[top++] = count;
merge(dele[i][0], dele[i][1]);
}
for(top --; top >= 0; top--)
{
printf("%d\n", mystack[top]);
}
}
return 0;
}

2013 ACM 通化邀请赛D.D-City 并查集的更多相关文章

  1. 2013 吉林通化邀请赛 D-City 离线型的并查集

    题意:给定n个点和m条边,问你拆掉前i条边后,整个图的连同城市的数量. i从1到m. 思路:计算连通的城市,很容易想到并查集,但是题目里是拆边,所以我们可以反向去做. 存下拆边的信息,从后往前建边. ...

  2. 2013 ACM 通化邀请赛 A. Tutor

    A. Tutor Description Lilin was a student of Tonghua Normal University. She is studying at University ...

  3. 2013 吉林通化邀请赛 Play Game 记忆化搜索

    dp[ba][ta][bb][tb]表示a堆牌从下面拿了ba张,从上面拿了ta张.b堆牌从下面拿了bb张,从上面拿了tb张.当前玩家能得到的最大的分数. 扩展方式有4种,ba+1,ta+1,bb+1, ...

  4. 2013 吉林通化邀请赛 Tutor 有点坑的水题

    计算12个数的和的平均数.四舍五入,不能有后导0. 我的做法是,将答案算出后,乘以1000,然后看个位是否大于等于5,判断是否要进位…… #include<iostream> #inclu ...

  5. “玲珑杯”ACM比赛 Round #7 B -- Capture(并查集+优先队列)

    题意:初始时有个首都1,有n个操作 +V表示有一个新的城市连接到了V号城市 -V表示V号城市断开了连接,同时V的子城市也会断开连接 每次输出在每次操作后到首都1距离最远的城市编号,多个距离相同输出编号 ...

  6. HDU ACM 2586 How far away ?LCA-&gt;并查集+Tarjan(离线)算法

    题意:一个村子有n个房子,他们用n-1条路连接起来,每两个房子之间的距离为w.有m次询问,每次询问房子a,b之间的距离是多少. 分析:近期公共祖先问题,建一棵树,求出每一点i到树根的距离d[i],每次 ...

  7. [tsA1491][2013中国国家集训队第二次作业]家族[并查集]

    m方枚举,并查集O(1)维护,傻逼题,,被自己吓死搞成神题了... #include <bits/stdc++.h> using namespace std; struct tri { i ...

  8. 西安邀请赛-D(带权并查集+背包)

    题目链接:https://nanti.jisuanke.com/t/39271 题意:给定n个物品,m组限制,每个物品有个伤害值,现在让两个人取完所有物品,要使得两个人取得物品伤害值之和最接近,输出伤 ...

  9. hduoj 4710 Balls Rearrangement 2013 ACM/ICPC Asia Regional Online —— Warmup

    http://acm.hdu.edu.cn/showproblem.php?pid=4710 Balls Rearrangement Time Limit: 6000/3000 MS (Java/Ot ...

随机推荐

  1. jQuery中怎么添加innerText、innerHtml(转)

    发现如果我在div或者其他非表单的标签中赋值,原本用普通的js就直接document.getElementById("id").innerHtml(或者其他几个)就可以了. 但是在 ...

  2. FileMode文件模式

    一.FileMode.Append Append追加: 如果文件存在,则打开文件,把指针指到文件的末尾:如果不存在,则新建文件 二.FileMode.Create Create:新建 如果文件存在,则 ...

  3. maven 常见错误解决

    1. maven打包编译时后台一直输出警告信息 [WARNING] File encoding has not been set, using platform encoding GBK, i.e. ...

  4. CentOS快速搭建subversion服务器

    环境:centos x86_64说明:使用daemon的方式来跑svn,不使用apache首先到:http://subversion.tigris.org/ 下载最新的subversion源码 我下的 ...

  5. 剑指offer系列54---数组中出现次数超过一半的数

    [题目]数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. * 例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}. * 由于数字2在数组中出现了5次,超过数组长度的一半,因 ...

  6. 多用less命令,不会输入h查看对应的详细文档

    在开发项目时候,难免要查看日志排查错误.之前只会用cat , more, less, tac, tail的简单功能, 但在实际工程中还是不够用的,至少效率很低.今天抽空看了下以下的博客,并实际进行了简 ...

  7. VirtualBox 下USB 设备加载的步骤及无法加载的解决办法

    1. 将u盘插入电脑,在windows能够识别后,进入VirtualBox的选定要加载的虚拟机,选择设置——>选择usb设备项 2. 选择右边的第一或者是第二个图标,增加一个新的筛选器,第一个图 ...

  8. angular2 的依赖注入

    angular2 的依赖注入包含了太多的内容,其中的一个重点就是注入器,而注入器又非常难理解,今天我们不深入介绍注入器的内容,可以参考官方文档,我们今天来说注入器的层级. 也就是组件获取服务的容器会选 ...

  9. DBA_VMware虚拟机安装和简介(案例)

    2014-08-08 Created By BaoXinjian

  10. 基于ZooKeeper的分布式Session实现(转)

    1.   认识ZooKeeper ZooKeeper—— “动物园管理员”.动物园里当然有好多的动物,游客可以根据动物园提供的向导图到不同的场馆观赏各种类型的动物,而不是像走在原始丛林里,心惊胆颤的被 ...