敌人的敌人是朋友的问题

输入是告诉某两个人是敌人,然后判断出某两个人是什么关系的问题。显然使用并查集来做。但是并查集只能表示两个元素之间有关联,还需要某种方法表示同一个集合中两个元素的关系,如果两个元素有关,要么就是敌人要么就是朋友。这样可以用从元素找到根的过程中的信息来判断两个元素的关系,可以使用权值的方法,在找到根的同时不断累加权值,最后判断奇偶,因为只有两种关系,如果多种关系还需要改变可以模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);

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值