战争联盟 陕西科大第一届程序设计竞赛G题

问题 G: 战争联盟

时间限制: 1 Sec   内存限制: 128 MB
提交: 26   解决: 11
[ 提交][ 状态][ 讨论版]

题目描述

我不知道第三次世界大战用的是什么武器,但我知道第四次世界大战时用的石头和木棍。
--爱因斯坦
 
在某个平行宇宙中,最糟糕的情况发生了,第三次世界大战一触即发!这个时候地球上的 n个国家,已经完全的分为了两个阵营,红色阵营和蓝色阵营。为了能够使得两方阵营能够和解,为了人类最终的命运不是核爆辐射,联合国正在采取各种各样的方式和手段促使双方阵营和解。 联合国首先要搞清楚一个问题,每一个国家都属于哪一方阵营。因为各方政治利益的权衡,所以绝大多数国家,并没有直接表态,自己属于哪个阵营。如今,联合国情报局获得了一些信息,每条信息包含两个国家的编号,表示这两个国家属于不同的阵营(情报正确无误)。凭借着现有这些零碎的信息,再给出任意两个国家的编号,能否确定他们属于同一方阵营呢?
假设此时地球上有 n个国家(2≤n≤10 ^ 5),国家的编号从1到n,每个国家不是属于红色阵营,就是属于蓝色正营。你将依次得到m条指令(2≤m≤10 ^ 5),这指令将只有以下两种情况:
1. D a b
a和b分别代表两个国家的编号。这一条指令的意思是a和b属于不同的阵营。
2.  A a b
a和b分别代表两个国家的编号。这一条指令的意思是,根据之前的所有指令,你要准确的判断出a和b是否属于同一个阵营。

输入

输入的第一行包含一个整数t(1 < =t < = 20),测试用例的数量。然后t组例子如下。每个测试用例以两个整数n和m开头,代表n个国家,后跟m行指令,每个行包含如上所述的一条消息。

输出

对于每一条A a b的指令,你的程序都应该根据之前得到的信息做出准确判断。

如果属于同一阵营,输出“Belong to same group.”

如果不属于同一阵营,输出“Belong to different group.”

如果不确定,输出“Not sure yet.”

样例输入

1
10 10
A 1 2
D 1 2
A 1 2
D 2 3
D 3 4
D 7 8
A 2 4
A 2 7
D 4 7
A 1 7

样例输出

Not sure yet.
Belong to different group.
Belong to same group.
Not sure yet.
Belong to same group.

对于这道题,算是一道并查集的模板题,和poj的食物链有点类似,话不多说放代码

#include<stdio.h>
#include<algorithm>

using namespace std;
#define maxn 100005
int par[maxn];
int rank1[maxn];
int a[maxn],b[maxn];
char c[maxn];
int n,k;
void init(int n)//模板 
{
	for(int i=0;i<n;i++)
	{
		par[i]=i;
		rank1[i]=0;
	}
} 
int find(int x)
{
	if(par[x]==x)
	{
		return x;
	}
	else
	{
		return par[x]=find(par[x]);
	}
}
void unite(int x,int y)
{
	x=find(x);
	y=find(y);
	if(x==y) return ;
	if(rank1[x]<rank1[y])
	{
		par[x]=y;
	}
	else
	{
		par[y]=x;
		if(rank1[x]==rank1[y])
		{
			rank1[x]++;
		}
	}
}
bool same(int x,int y)
{
	return find(x)==find(y);
}//模板 
int main()
{
	int n,k,t;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d %d",&n,&k);
		init(2*n);//初始化 
		for(int i=0;i<k;i++)
		{
			getchar();
			scanf("%c%d%d",&c[i],&a[i],&b[i]);
			int x=a[i]-1,y=b[i]-1;
			if(c[i]=='D')
			{
				unite(x,y+n);//不在同一类 
				unite(x+n,y);//不在同一类 
			}
			else if(c[i]=='A')
			{
				if(same(x+n,y+n)||same(x,y))
				{
					printf("Belong to same group.\n");
				}
				else if(same(x,y+n)||same(x+n,y))
				{
					printf("Belong to different group.\n");
				}
				else
				{
					printf("Not sure yet.\n");
				}
			}
		}
	}
	return 0;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值