【bzoj3060】[Poi2012]Tour de Byteotia 并查集

题目描述

给定一个n个点m条边的无向图,问最少删掉多少条边能使得编号小于等于k的点都不在环上。

输入

第一行三个整数n,m,k;

接下来m行每行两个整数ai,bi,表示ai和bi之间有一条无向边。

输出

一个整数,表示最少的删边数量。

样例输入

11 13 5
1 2
1 3
1 5
3 5
2 8
4 11
7 11
6 10
6 9
2 3
8 9
5 9
9 10

样例输出

3



题解

并查集

先把不包含编号小于等于k的点的边连上,用并查集维护图的连通性。易知如果删除这些边则一定不是最优解,所以这些边不计入答案中。

然后考虑其它的包含编号小于等于k的点,判断它的两个端点是否连通,如果连通则说明它们在一个环内,需要删掉这条边,答案+1;否则把这条边连上。

#include <cstdio>
#define N 1000010
int f[N] , x[N << 1] , y[N << 1];
int find(int x)
{
	return x == f[x] ? x : f[x] = find(f[x]);
}
int main()
{
	int n , m , k , i , ans = 0;
	scanf("%d%d%d" , &n , &m , &k);
	for(i = 1 ; i <= n ; i ++ ) f[i] = i;
	for(i = 1 ; i <= m ; i ++ )
	{
		scanf("%d%d" , &x[i] , &y[i]);
		if(x[i] > k && y[i] > k) f[find(x[i])] = find(y[i]);
	}
	for(i = 1 ; i <= m ; i ++ )
	{
		if(x[i] <= k || y[i] <= k)
		{
			if(find(x[i]) == find(y[i])) ans ++ ;
			else f[f[x[i]]] = f[y[i]];
		}
	}
	printf("%d\n" , ans);
	return 0;
}
时间: 2024-10-11 01:22:57

【bzoj3060】[Poi2012]Tour de Byteotia 并查集的相关文章

UVALive 4035 - Undetectable Tour(并查集)

题意:给定一个 N * N(3 <= N <= 10000)的矩形区域,左下角为(0,0),右上角为(N,N),现在要从左下角走到右上角,但是有 k(k <= 100)个监视器,每个监视器的监视范围都是统一的,现给定监视范围可能出现的种类与概率,求能够逃出去的概率.(计算距离时均用曼哈顿距离) 1.若两个监视器的距离 <= 两个监视器的监视范围之和,则这两个监视器间的路就不可走: 2.若监视器距离墙的距离 <= 监视器的监视范围,则监视器与墙之间就不可走: 综上,对于每一个监

L2-013. 红色警报 (并查集)

战争中保持各个城市间的连通性非常重要.本题要求你编写一个报警程序,当失去一个城市导致国家被分裂为多个无法连通的区域时,就发出红色警报.注意:若该国本来就不完全连通,是分裂的k个区域,而失去一个城市并不改变其他城市之间的连通性,则不要发出警报. 输入格式: 输入在第一行给出两个整数N(0 < N <=500)和M(<=5000),分别为城市个数(于是默认城市从0到N-1编号)和连接两城市的通路条数.随后M行,每行给出一条通路所连接的两个城市的编号,其间以1个空格分隔.在城市信息之后给出被攻

hdu 3461 Code Lock(并查集)

想不到这还可以用并查集解,不过后来证明确实可以…… 题意也有些难理解—— 给你一个锁,这个所由n个字母组成,然后这个锁有m个区间,每次可以对一个区间进行操作,并且区间中的所有字母要同时操作.每次操作可以将区间中所有字母+1.即把a变成b,把z变成a. 举个例子,比如有一个锁,由abcdef组成,前三个字母abc是一个区间,第四五个字母de是一个区间,那么如果对abc操作一次,则获得新锁bcddef,再对de区间操作一次,得bcdeff.但是,最后一个字母f是不能操作的. 如果一把锁通过对可操作区

SPOJ LEXSTR 并查集

题目描述: Taplu and Abhishar loved playing scrabble. One day they thought of inventing a new game using alphabet tiles. Abhishar wrote a string using tiles and gave a set of pairs (i,j) to Taplu. Pair "i, j" (0 based indexing) means that Taplu can s

BZOJ 1116 [POI2008]CLO(并查集)

[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1116 [题目大意] Byteotia城市有n个towns,m条双向roads.每条road连接两个不同的towns, 没有重复的road.你要把其中一些road变成单向边使得:每个town都有且只有一个入度 [题解] 我们发现当一个连通块边数大于等于其点数的时候就满足条件, 那么此题如果出现边数少于点数的连通块就不成立, 用并查集能够完成判断. [代码] #include <cstd

HDU 1811 Rank of Tetris 拓扑排序+并查集

Rank of Tetris Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description 自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球. 为了更好的符合那些爱好者的喜好,Lele又想了一个新点子:他将制作一个全球Tetris高手排行榜,定时更新,名堂要比福布斯富豪榜还响.关于如何排名,这个不用说都知道是根据Rating从高到低

CodeForces 566D Restructuring Company (并查集+链表)

题意:给定 3 种操作, 第一种 1 u v 把 u 和 v 合并 第二种 2 l r 把 l - r 这一段区间合并 第三种 3 u v 判断 u 和 v 是不是在同一集合中. 析:很容易知道是用并查集来做,但是如果单纯的用并查集,肯定是要超时的,所以要用链表,如果合并了,就把链表指向, 这样就搞定了这个题. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #i

(并查集) bzoj 1161

[bzoj1116][POI2008]CLO 2014年5月13日3470 Description Byteotia城市有n个 towns m条双向roads. 每条 road 连接 两个不同的 towns ,没有重复的road. 你要把其中一些road变成单向边使得:每个town都有且只有一个入度 Input 第一行输入n m.1 <= n<= 100000,1 <= m <= 200000 下面M行用于描述M条边. Output TAK或者NIE 常做POI的同学,应该知道这两

Kruskal算法(贪心+并查集=最小生成树)

http://www.51nod.com/ Kruskal算法的高效实现需要一种称作并查集的结构.我们在这里不介绍并查集,只介绍Kruskal算法的基本思想和证明,实现留在以后讨论. Kruskal算法的过程: (1) 将全部边按照权值由小到大排序. (2) 按顺序(边权由小到大的顺序)考虑每条边,只要这条边和我们已经选择的边不构成圈,就保留这条边,否则放弃这条边. 算法 成功选择(n-1)条边后,形成一个棵最小生成树,当然如果算法无法选择出(n-1)条边,则说明原图不连通. 以下图为例: 边排