数据结构 并查集 UVA 10158

题意:给定n个城市,进行询问,1代表结盟,2代表敌对,3询问是否结盟,4询问是否敌对。如果有矛盾的情况输出-1,询问正确输出1失败输出0.

思路:并查集,0 - n代表结盟集合,n - 2n代表敌对集合。


#include <cstdio>
#include <math.h>
#include <cstring>
int n;
int parent[20005];
int find(int x)
{
	if(x!=parent[x]) return parent[x]=find(parent[x]);
	else return x;
}

int main()
{
	while(scanf("%d",&n)!=EOF)//n个城市 
	{
		int q,a,b;
		for(int i=0;i<n;i++)
		{
			parent[i]=i;    // 同盟 
			parent[i+n]=i+n;// 另一个同盟国 
		}
		while(scanf("%d %d %d",&q,&a,&b)!=EOF &&q)
		{    
			//每次输入的两个国家都单独考虑
			//一个同盟国      //另一个同盟国 
			int a1= find(a);  int a2=find(a+n);
			int b1= find(b);  int b2=find(b+n);
			
			//本题 可以将 看成两边
			/*
			1              1
			2              2
			3              3
			4              4
			5              5
			同盟,自己连起来
			敌对,交叉连起来 
			 			*/ 
			//同盟国里的一个国家  和 每一个敌对国家 敌对。 
			if(q==1)
			{ //若已经敌对。报错 
				if(a1==b2) printf("-1\n");
				else 
				{
					parent[a1]=b1;//同盟,将a1和b1 连接起来 
					parent[a2]=b2;//同盟,将a2和b2 连接起来 
				}
			}
			else if(q==2)// 确认敌对 
			{   //若已经同盟。报错 
				if(a1==b1) printf("-1\n");
				else {
					parent[a1]=b2;
					parent[a2]=b1;
				}
			}
			else if(q==3)
			{
				if(a1==b1) printf("1\n");
				else printf("0\n");
			}
			else if(q==4)
			{
				if(a1==b2) printf("1\n");
				else printf("0\n");
			}
		}
			
	}
	return 0;
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值