战争联盟(并查集)
题目描述
我不知道第三次世界大战用的是什么武器,但我知道第四次世界大战时用的石头和木棍。
--爱因斯坦
在某个平行宇宙中,最糟糕的情况发生了,第三次世界大战一触即发!这个时候地球上的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.
ac:代码
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = (int)1e5+5;
int par[maxn],val[maxn];
void init(int n)
{
for(int i =0;i<n;i++) par[i] = i;
memset(val,0,sizeof(val));
}
int find(int x)
{
if(x==par[x]) return x;
int t=find(par[x]);
val[x]=(val[par[x]]+val[x])%2;
return par[x]=t;
}
void unite(int x,int y)
{
int t = find(y);
val[t]=(1+val[x]-val[y])%2;
par[t]=find(x);
}
int main()
{
int t;
cin>>t;
while(t--)
{
int n,m;
cin>>n>>m;
init(n);
char a;
int b,c;
for(int i = 0;i<m;i++)
{
getchar();
scanf("%c %d %d",&a,&b,&c);
if(a=='A')
{
if(find(b)!=find(c)) printf("Not sure yet.\n");
else
{
if(val[b]==val[c]) printf("Belong to same group.\n");
else printf("Belong to different group.\n");
}
}
else if(a=='D')
{
unite(b,c);
}
}
}
}
题目链接点击打开链接