A - X-Plosives (UVALive - 3644)

- 题目大意

有若干个由两种元素组成的简单化合物,现在把它们装进车里,如果车上有恰好有k种简单化合物并且恰好有k种元素的话,那么就会引发爆炸,所以车上的化合物必须避免满足这个条件。

- 解题思路

如果元素表示点,那么化合物就表示边,要爆炸的条件就是形成环,即为k个点k条边,那么就肯定存在环。直接用并查集判断就好了。

- 代码

#include<iostream>
#include<cstdio>
using namespace std;
const int MAX = 1e5 + 50;
int fa[MAX];
void init(int n)
{
	for (int i = 0; i <= n; i++)
		fa[i] = i;
}

int find(int x)
{
	if (x == fa[x])
		return x;
	else
	{
		return fa[x] = find(fa[x]);
	}
}

int main()
{
	int x, y;
	while (scanf("%d", &x) != EOF)
	{
		init(MAX);
		int sum = 0;
		while (x != -1)
		{
			scanf("%d", &y);
			int fx = find(x), fy = find(y);
			if (fx == fy)
				sum++;
			else
			{
				fa[fx] = fy;
			}
			scanf("%d", &x);
		}
		printf("%d\n", sum);
	}
	return 0;
}

  

原文地址:https://www.cnblogs.com/alpacadh/p/8449424.html

时间: 2024-10-07 11:45:01

A - X-Plosives (UVALive - 3644)的相关文章

H - Aquarium (UVALive - 7303 )

- 题目大意 给你一个r * c的格子,每个格子有一个 ' \ ' 或者 '/' 的墙,以及打掉墙的费用,问使得所有块联通的最小费用.(自己可以配合图来看好理解一点) - 解题思路 我们可以将其转化成联通块的问题,就是把每个格子看成两部分,左侧和右侧.以一行来看,假设两个格子A,B.那么B格子的右侧的编号一定和A格子的左侧的编号相同.给每个格子的左右侧标上号,然后加入边,边的两个端点为一个格子的两个编号.权值为墙的费用然后处理行与行之间的边,然后假设上边格子为A,下面格子为B.那么如果A是'/'

Repeated Substrings(UVAlive 6869)

题意:求出现过两次以上的不同子串有多少种. /* 用后缀数组求出height[]数组,然后扫一遍, 发现height[i]-height[i-1]>=0,就ans+=height[i]-height[i-1]. */ #include<cstdio> #include<iostream> #include<cstring> #define N 100010 using namespace std; int sa[N],rk[N],ht[N],t1[N],t2[N]

F - Elevator Stopping Plan (UVALive - 2949)

- 题目大意 某个公司只有一个电梯, 现在有n 个人从1楼, 他们有各自想要到达的楼层, 然后电梯每上一楼需要4 秒, 每在一个楼层开门需要10 秒, 然后然爬楼梯的话需要20一楼.问, 如何用最短的时间让所有人都到达各自想要到的楼层. - 解题思路 因为人可以爬楼梯, 所以可以在某个楼层下楼之后走楼梯到达想要到的楼层, 只要在最后一个人到达之前就可以. 对于时间可以采取二分的方式搜索, 所以只要判断某个时间能否将所有人送到指定楼层就可以了. 对于判断我们可以用贪心去做, 尽量让电梯停在较高的楼

UVALive - 3641 Leonardo&#39;s Notebook(polya计数)

题意:给出26个大写字母的置换B,问是否存在一个置换A,使A*A=B? 两个长度为N的相同循环相乘,当N为奇数时结果也是一个长度为N的循环,当N为偶数时分裂为两个长度为N/2的循环.相反,对于一个任意长度为N的奇数循环B,都能找到一个长度为N的循环A使得A*A=B,对于任意两个长度为N(N不一定为偶数)的不相交循环B和C,都能找到一个长度为2N的循环A使得A*A=B*C. 于是只要判断置换B里循环长度相同的且都为偶数(2,4,6, 8.....)的循环个数是不是都为偶数(偶数就能两两配对),只要

UVALive 6275 Joint Venture(查找等值)

转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents 题意: 大意:问是否存在两块乐高的长度等于上面给出的长度: 一.二分查找版; #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; int n,num[1000047]; int main() { in

UVALive 5966 Blade and Sword -- 搜索(中等题)

题意:给一幅地图,P为起点,D为终点,'*'为传送阵,到达传送阵可以传到任意一个其他的传送阵,传到以后可以正常走或者再传回来,问P->D最短步数. 分析:这题一定要细心,分析要到位才能搞定,错一点都WA.有两种思路: 1.走到一个传送点之后,将所有能传到的地方都加入队列,然后清除传送阵向量(vector),因为以后不用再互相传了,对于某个传送阵k,以后从别的点传到k的效果还不如从这个点传到k,所以清空传送阵,又因为其他传送阵可以传回来,此时传送阵向量要把当前传送阵push_back进去,以便其他

UVALive - 3942 - Remember the Word (Trie树)

UVALive - 3942 Remember the Word Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description Neal is very curious about combinatorial problems, and now here comes a problem about words. Knowing that Ray has a p

UVALive - 3211 (2-SAT + 二分)

layout: post title: 训练指南 UVALive - 3211 (2-SAT + 二分) author: "luowentaoaa" catalog: true mathjax: true tags: - 2-SAT - 图论 - 训练指南 Now or later UVALive - 3211 题意 n架飞机,每架可选择两个着落时间.安排一个着陆时间表,使得着陆间隔的最小值最大 题解 二分查找最大值P,每次都用2-SAT判断是否可行. #include<bits

训练指南 UVALive - 3415(最大点独立集)

layout: post title: 训练指南 UVALive - 3415(最大点独立集) author: "luowentaoaa" catalog: true mathjax: true tags: - 二分图 - 图论 - 训练指南 Guardian of Decency UVALive - 3415 我们将男女分开来 就可以建出一个二分图,对于任意的男女生 只要上边四个条件一个也不满足 就表示不能同时去 ,那么我们在其中间连一条边,那么最终的结果就是我们从中取出尽量多的点,