UVA 1160 - X-Plosives 即LA3644 并查集判断是否存在环

本文探讨了一种新型爆炸物的特性与安全配送策略。通过分析特定组合的产品如何触发爆炸,提出了一种基于并查集的算法来识别潜在的爆炸组合,并确保安全配送过程不包含危险的爆炸物组合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

X-Plosives

 

A secret service developed a new kind ofexplosive that attain its volatile property only when a specific association ofproducts occurs. Each product is a mix of two different simple compounds, towhich we call abinding pair. If N>2, thenmixing N different binding pairs containing N simple compounds creates apowerful explosive.For example, the bindingpairs A+B, B+C, A+C (three pairs, three compounds) result in an explosive,while A+B, B+C, A+D (three pairs, four compounds) does not.

 

You are not a secret agent but only a guyin a delivery agency with one dangerous problem: receive binding pairs insequential order and place them in a cargo ship. However, you must avoidplacing in the same room an explosive association. So, after placing a set ofpairs, if you receive one pair that might produce an explosion with some of thepairs already in stock, you must refuse it, otherwise, you must accept it.

 

An example. Let’s assume you receive thefollowing sequence: A+B, G+B, D+F, A+E, E+G, F+H. You would accept the firstfour pairs but then refuse E+G since it would be possible to make the followingexplosive with the previous pairs: A+B, G+B, A+E, E+G (4 pairs with 4 simplecompounds). Finally, you would accept the last pair, F+H.

 

Compute thenumber of refusals given a sequence of binding pairs.

 

Input

The input will contain several test cases, each of them as described below.Consecutive test cases are separated by a single blank line.

Instead of letters we will use integersto represent compounds. The input contains several lines. Each line(except the last) consists of two integers (each integer lies between 0 and 105)separated by a single space, representing a binding pair. The input ends in aline with the number –1. You may assume that no repeated binding pairsappears in the input.

 

Output

For each test case, a single line with the number ofrefusals.

 

Sample Input

1 2

3 4

3 5

3 1

2 3

4 1

2 6

6 5

-1

 

Sample Output

3



http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3601


题意:   有一些简单化合物   每个化合物由2中不同元素组成        然后按照顺序依次将这些化合物放进车里   但是如果车上存在k个简单化合物 且正好包含k中元素的话

那么他们将变成易爆的化合物   为安全起见     每当你拿到一个化合物的时候   如果它和已装车的化合物形成易爆化合物   你就应当拒绝装车  否则就应该装车

请输出有多少个化合物没有装车


思路:

注意题目要求k个简单化合物 且正好包含k中元素   是任意k个化合物 也就是说 只要车里存在任意k个化合物 如果他们含有元素也为k个 则不能装入这样的一个化合物

可以把每个元素看成顶点   一个化合物作为一条边   当整个图存在环的时候 组成环的边对应的化合物就是危险的 否则是安全的

判断是否会组成环 可以通过并查集  如果要添加的边 x y同时在同一个集合中  那么它将组成环  拒绝它  (参考刘汝佳 入门经典 )

#include<stdio.h>
#include<string.h>
const int size=100001;
int parent[size],rank[size],count;
void init()
{
	int i;
	for(i=0;i<size;i++)
	{
		parent[i]=i;
		rank[i]=1;
	}
	count=0;
}
int find(int n)
{
	return n==parent[n]?n:parent[n]=find(parent[n]);
}
void join(int a,int b)
{
        if(rank[a]>rank[b])
		{
			parent[b]=a;
			rank[a]+=rank[b];
		}
		else
		{		
			parent[a]=b;
			rank[b]+=rank[a];
		}
}
int main()
{
	int a,b;
	init();
	while(scanf("%d",&a)!=EOF)
	{
		if(a==-1)
		{
             printf("%d\n",count);  init();  continue;
		}
		scanf("%d",&b);
        a=find(a);
		b=find(b);
		if(a==b)  count++;
		else join(a,b);
	}
	return 0;
}




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值