排座位(并查集)

2023-11-17

        如果这一题蛮力求解,会很复杂,关系网都能把自己弄晕,所以采取简化的算法----并查集
        所以你需要弄清楚并查集算法
        概念:即支持对集合进行合并和查询的一个数据结构
        合并:将元素a和元素b所在的集合合并成一个集合
        查询:查询a和b是否为同一集合
如图:
在这里插入图片描述
        引入一个父亲数组parent[i],parent[i]表示第i个元素所在的集合
        初始化:最开始时每个元素都在各自的集合里,即parent[i] = i
        合并:如果要合并集合a和b,就把所有a所在的集合的所有元素合并到b所在的集合
        查询:查询(a,b)是否在同一个集合里,就查询parent[a]是否等于parent[b],也就是a和b是否为同一父亲即可
如图:
在这里插入图片描述
        算法实现
        初始化:

void init(int *a, int n)
{
	for(int i = 0; i < n; ++i)//每个元素自成一个集合
	{
		a[i] = i;
	}
}

        合并:

void uni(int *a, int p, int q, int n)
{
	//将集合a中元素都并在集合b之中
	int pid = a[p];
	int qid = a[q];
	for(int i = 0; i < n; ++i)
	{
		if(a[i] == qid)
		{
			a[i] = pid;
		}
	}
}

        查询:

bool connected(int *a, int p, int q)
{
	if(a[p] == a[q])
		return true;
	else
		return false;
}

        再来看排座位这一题:
        布置宴席最微妙的事情,就是给前来参宴的各位宾客安排座位。无论如何,总不能把两个死对头排到同一张宴会桌旁!这个艰巨任务现在就交给你,对任何一对客人,请编写程序告诉主人他们是否能被安排同席。
输入格式:
        输入第一行给出3个正整数:N(≤100),即前来参宴的宾客总人数,则这些人从1到N编号;M为已知两两宾客之间的关系数;K为查询的条数。随后M行,每行给出一对宾客之间的关系,格式为:宾客1 宾客2 关系,其中关系为1表示是朋友,-1表示是死对头。注意两个人不可能既是朋友又是敌人。最后K行,每行给出一对需要查询的宾客编号。
这里假设朋友的朋友也是朋友。但敌人的敌人并不一定就是朋友,朋友的敌人也不一定是敌人。只有单纯直接的敌对关系才是绝对不能同席的。
输出格式:
        对每个查询输出一行结果:如果两位宾客之间是朋友,且没有敌对关系,则输出No problem;如果他们之间并不是朋友,但也不敌对,则输出OK;如果他们之间有敌对,然而也有共同的朋友,则输出OK but…;如果他们之间只有敌对关系,则输出No way。
输入样例:
7 8 4
5 6 1
2 7 -1
1 3 1
3 4 1
6 7 -1
1 2 1
1 4 1
2 3 -1
3 4
5 7
2 3
7 2
输出样例:
No problem
OK
OK but…
No way
        这一题的查询有一些难度,需要用到递归,if(parent[i] == i) return i;可以直接返回,但是还有一种情况就是需要找到它的父亲,因为它是经过合并之后,这时index = GetOriNode(parent[i]) return index;其余部分就没什么难度了
        代码如下:

#include <iostream>
using namespace std;
#define MAXN 105
int dp[MAXN][MAXN];
int parent[MAXN];

void Init_Parent_Real(int n)
{
	int i, j;
	for(i = 1; i <= n; ++i)
	{
		parent[i] = i;
		for(j = 1; j <= n; ++j)
		{
			dp[i][j] = 0;
		}
	}
}

int GetOriNode(int pos)
{
	if(parent[pos] == pos)
	{
		return pos;
	}
	int index = GetOriNode(parent[pos]);
	return index;
}

int Union(int m1, int m2)
{
	if(GetOriNode(m1) != GetOriNode(m2))
	{
		int index = GetOriNode(m1);
		parent[index] = GetOriNode(m2);	
	}	
} 

int main()
{
	int i, n, m, k, r1, r2, customer1, customer2, relation;
	scanf("%d%d%d", &n, &m, &k);
	Init_Parent_Real(n);
	
	for(i = 0; i < m; ++i)
	{
		scanf("%d%d%d", &customer1, &customer2, &relation);
		dp[customer1][customer2] = relation;
		dp[customer2][customer1] = relation;
		if(relation == 1)
		{
			Union(customer1, customer2);
		}
	}
	i = 0;
	while(i < k)
	{
		scanf("%d%d", &r1, &r2);
		if(dp[r1][r2] == 1) printf("No problem\n");
		else if(dp[r1][r2] == -1)
		{
			if(GetOriNode(r1) == GetOriNode(r2)) printf("OK but...\n");
			else printf("No way\n");
		}
		else
		{
			printf("OK\n");	
		}
		++i; 
	}
	return 0;
}

        OK!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

排座位(并查集) 的相关文章

  • 产业互联网-构建智能+时代数字生态新图景

    在2019腾讯全球数字生态大会新闻发布会上 腾讯云联合腾讯研究院 共同发布了行业重磅报告 产业互联网 构建智能 时代数字生态新图景 报告首次阐述了产业互联网的战略框架和实践方法论 报告指出 产业互联网的实现 需要跨界共建数字生态共同体 形成

随机推荐

  • linux安装telnet工具下载,Linux下安装telnet的方法

    一 安装telnet 1 检测telnet server的rpm包是否安装 root localhost rpm qa telnet server 若无输入内容 则表示没有安装 出于安全考虑telnet server rpm是默认没有安装的
  • NestedScrolling机制(一)——概述

    http blog csdn net al4fun article details 53888990 如今 NestedScrolling机制 可以称为嵌套滚动或嵌套滑动 在各种app中的应用已经十分广泛了 下图是 饿了么 中的一个例子 当
  • 虹膜识别 Iris_Osiris_v4.1源码,mfc测试用例

    01 资源 win10 vs2015 git opencv3 3 0 cmake 参考虹膜识别文档 开源虹膜识别软件OSIRIS4 1的使用入门 将开源虹膜识别算法OSIRIS4 1移植到Windows opencv3 3 0的配置参考 也
  • Leetcode 202. 快乐数(找规律注意回环)

    快乐数 编写一个算法来判断一个数 n 是不是快乐数 快乐数 定义为 对于一个正整数 每一次将该数替换为它每个位置上的数字的平方和 然后重复这个过程直到这个数变为 1 也可能是 无限循环 但始终变不到 1 如果 可以变为 1 那么这个数就是快
  • 记录几个CentOS安装包(rpm)的下载地址-离线安装必备

    1 http rpmfind net linux RPM index html 2 https centos pkgs org 3 http mirror centos org centos 7 extras x86 64 Packages
  • Java处理SSH

    JSch 登录 密码方式 session setPassword password 公私秘钥方式 jsch addIdentity ssh id rsaxxx SFTP简介 SFTP是Secure File Transfer Protoco
  • 【YOLOv7/YOLOv5系列算法改进NO.49】模型剪枝、蒸馏、压缩

    文章目录 前言 一 解决问题 二 基本原理 三 剪枝操作 四 知识蒸馏操作 前言 作为当前先进的深度学习目标检测算法YOLOv7 已经集合了大量的trick 但是还是有提高和改进的空间 针对具体应用场景下的检测难点 可以不同的改进方法 此后
  • go 设置 GOROOT 和 GOPATH

    点击在我的博客 xuxusheng com 中查看 有更好的排版哦 发表失败全部丢失 写完了又重写一遍 csdn 都没个自动保存功能 强烈吐槽 go 里面有两个非常重要的环境变量 GOROOT 和 GOPATH 其中 GOROOT 是安装
  • linux CPU性能监控(进阶)和杂谈

    线程与进程的区别 进程 是执行一段程序 即一旦程序被载入到内存中准备执行 它就是一个进程 线程 单个进程中执行每一个任务就是一个线程 一个线程只属于一个进程 一个进程里可以有多个线程 上下文切换 在处理器执行期间 运行进程的信息被存储在处理
  • javax.net.ssl.SSLException: Received fatal alert: protocol_version

    最近需要第三方回传数据到自己的地址 发现调不通 如下 1 第三方错误提示 根据提示是请求时所用的tls协议版本与目标地址所能使用的不一致 2 第三方查看代码中所有的tls版本 查看目标地址所能支持的tls版本 nmap script ssl
  • Python的十二道编程题,码住战胜一切

    一 计算文件大小 import os def get size path size 0 l path while l path l pop lst os listdir path for name in lst son path os pa
  • Visuial Studio 打开 Unity 新建脚本时,新脚本继承MonoBehaviour暂时失效为白色的解决方法

    点击 文件 gt 最近使用的项目和解决方案 gt 点击当前项目 即可瞬间重载当前项目 这个时候 白色的MonoBehaviour会变成绿色 就可以了 当然最传统的方法就是关掉VS再打开 不过挺浪费时间的
  • umijs框架加载cesium

    创建umi项目 yarn create umi 选择app 选择是否使用typescript N 选择依赖 yarn yarn start 项目创建完成后 添加cesium yarn add cesium 下载版本是1 67 不同版本配置方
  • 【Android】替换系统默认字体

    android系统默认字体分类 DroidSans ttf 系统默认英文字体 DroidSans Bold ttf 系统默认英文粗字体 DroidSansFallback ttf 系统默认中文字体 为系统新增字体 1 复制字体到framew
  • python机器学习之支持向量机——线性SVM决策过程的可视化案例

    线性SVM决策过程的可视化 1 导入需要的模块 from sklearn datasets import make blobs from sklearn svm import SVC import matplotlib pyplot as
  • QT中on_pushButton_clicked()用法

    在Qt里按钮控件默认对应一个on pushButton clicked 成员 如果想用点击信号 在代码中实现on pushButton clicked 成员即可 最近看了一段代码 里面并没有connect函数 只定义了pushbutton
  • 互联网编程之多线程/线程池TCP服务器端程序设计

    目录 需求 多线程TCP服务器 线程池TCP服务器 测试 日志模块 需求 多线程TCP服务器 30分 设计编写一个TCP服务器端程序 需使用多线程处理客户端的连接请求 客户端与服务器端之间的通信内容 以及服务器端的处理功能等可自由设计拓展
  • 若依框架注册新用户同时设置默认角色

    前提 开启注册 环境 ruoyi vue 3 8 5 如使用其他版本的ruoyi框架 操作可能不相同 操作 1 ruoyi system src main java com ruoyi system service impl SysUser
  • 【算法】离散傅里叶变换(DFT)

    真实的系统是会离散的 时变的 理想者将瞬时态看成时线性的系统 将时变系统分成了不同阶段 离散在围观层面是连续的 但从表层感受时 变化是迅猛的 可以忽略不计变化的过程 因而成为了离散 一 离散系统 离散控制系统是指在控制系统的一处或数处信号为
  • 排座位(并查集)

    如果这一题蛮力求解 会很复杂 关系网都能把自己弄晕 所以采取简化的算法 并查集 所以你需要弄清楚并查集算法 概念 即支持对集合进行合并和查询的一个数据结构 合并 将元素a和元素b所在的集合合并成一个集合 查询 查询a和b是否为同一集合 如图