输入是告诉某两个人是敌人,然后判断出某两个人是什么关系的问题。显然使用并查集来做。但是并查集只能表示两个元素之间有关联,还需要某种方法表示同一个集合中两个元素的关系,如果两个元素有关,要么就是敌人要么就是朋友。这样可以用从元素找到根的过程中的信息来判断两个元素的关系,可以使用权值的方法,在找到根的同时不断累加权值,最后判断奇偶,因为只有两种关系,如果多种关系还需要改变可以模3。
在试验算法的时候奇偶不用考虑一般情况,考虑一些特殊情况代入可以就好。
#include<iostream>
using namespace std;
struct node{
int p;
int w;
} ns[10001];
void slove(char type,int a,int b){
int ra=a,rb=b;
int wa=0,wb=0;
while(ns[ra].p!=0){
wa += ns[ra].w;
ra = ns[ra].p;
}
wa += ns[ra].w;
while(ns[rb].p!=0){
wb += ns[rb].w;
rb = ns[rb].p;
}
wb += ns[rb].w;
if(type=='D'){
if(ra!=rb){
if(wa>=wb){
ns[rb].p=ra;
ns[rb].w=(wa-wb+1)%2;
}else{
ns[ra].p=rb;
ns[ra].w=(wb-wa+1)%2;
}
}
}else if(type=='A'){
if(ra != rb) cout<<"Not sure yet."<<endl;
else{
if((wa-wb)%2==0) cout<<"In the same gang."<<endl;
else cout<<"In different gangs."<<endl;
}
}
}
int main(){
int t,m,n;
int i,a,b;
char ty;
cin >> t;
cin >> n >> m;
memset(ns,10001,sizeof(struct node));
while(t--){
for(i=0;i<m;i++){
cin >> ty >> a >> b;
slove(ty,a,b);
}
}
}