蓝桥杯之并查集

embedded/2025/2/14 5:30:40/

算法思想

并查集是一种树形的数据结构,主要用于解决一些元素分组问题。用于处理一些不相交集合的合并以及查询问题。并查集的思想是用一个数组表示了整片森林,树的根节点唯一标识了一个集合,我们只要找到了某个元素的树根,就能确定他在哪个集合里

问题场景:

合并:将若干个元素合并到一个或者多个集合(构成一棵

树或多棵树),将多个集合合并(多棵树合并为一棵树),合并x,y两个元素时,不能直接合并两个元素,而是要合并两个元素所在的树根

查询:查询两个元素是否在同一个集合中。查询x和y是否在同一个集合,查找x和y对应的树根,看看是否是同一个树的树根

其他:计算共有几个集合(几棵树)

代码实现:

//并查集,(查找两个数字在不在一个集合中)
const int Size = 9;//(数字范围为1-8),在parent数组中下标就可以来表示数字,下标对应的值
//就可以来指向其父节点
int parent[Size];
//加权优化,规定节点层数,每次放节点时从节点层数高的放
int Rank[Size];
//加权优化与路径压缩只能存在一个,因为路径压缩会改变Rank值
//找x对应的父节点
int find(int x)
{if (x == parent[x]){return x;}//路径压缩:在将每一个的值得父节点都改为最终的父节点//parent[x]= find(parent[x]);//return parent[x];return find(parent[x]);
}
//合并就是去合并根节点
void merge(int x, int y)
{x = find(x);y = find(y);if (x != y){if (Rank[x] > Rank[y]){parent[y] = x;}else if (Rank[x] < Rank[y]){parent[x] = y;}else{parent[y] = x;Rank[x]++;}}
}
int main()
{for (int i = 0; i < Size; i++){//刚开始默认父节点为自己parent[i] = i;Rank[i] = 1;}int x, y;for (int i = 0; i < 6; i++){cin >> x >> y;merge(x, y);}cout << (find(6)==find(1))?"ok":"no";return 0;
}

例子:最小生成树

现在有一个地点为Ai,一个地点为Bi,又一个结构为一条路,这条路连接(存储)了两个地点,还有到这两个地点的距离cost,一个Ai一个Bi一个cost构成了一个最小集合,现在有n个这样的集合,

那么可以根据这个cost,比如现在根据cost来将n个最小集合排序,现在问一个Ai到Bj之间怎么怎么样,那Ai与Bj肯定是要相互连通的,根据上面的并查集结构,将这n个最小集合构成一个并查集所形成的的树就叫最小生成树,如果Ai与Bj有公共父节点那么他们肯定是连通的,这时可以根据题目要求结合下面的代码进行求解(比如问题:躲避拥堵的最佳路线)

struct Edge
{Edge(int s, int e, int c) :start(s), end(e), cost(c){}int start;int end;int cost;
};
int parent[10000];
int find(int x)
{if (x == parent[x]){return x;}return parent[x] = find(parent[x]);
}
bool Mycompare(const Edge& e1, const Edge& e2)
{return e1.cost < e2.cost;
}
int main()
{for (int i = 0; i < 10000; i++){parent[i] = i;}vector<Edge>edge;int n;cin >> n;char s, e;int c;for (int i = 0; i < n; i++){cin >> s >> e >> c;edge.push_back(Edge(s, e, c));}sort(edge.begin(), edge.end(), Mycompare);for (int j = 0; j < edge.size(); j++){int a = find(edge[j].start);int b = find(edge[j].end);if (a != b){parent[a] = b;printf("%c->%c:cost:%d ", edge[j].start, edge[j].end, edge[j].cost);}}return 0;
}

http://www.ppmy.cn/embedded/162064.html

相关文章

解码DeepSeek家族系列:大语言模型赛道上的黑马传奇

1. DeepSeek公司概况 1.1 成立背景与发展历程 DeepSeek&#xff0c;全称杭州深度求索人工智能基础技术研究有限公司&#xff0c;于2023年7月17日正式成立。公司由知名量化资管巨头幻方量化孕育而生&#xff0c;其创始人梁文峰是幻方量化的联合创始人之一。DeepSeek自成立之初…

抖音火山方舟使用Chatbox接入DeepSeek-R1满血版671B

抖音火山方舟使用Chatbox接入DeepSeek-R1满血版671B 抖音火山方舟 1.1 注册登录 1.2 实名认证 1.3 创建推理模型 点击添加模型 1.4 创建API密钥 1.5 客户端工具 OllamaChatboxCherry StudioAnythingLLM 资源包下载&#xff1a; AI聊天本地客户端 接入Chatbox客户端 点…

基于单片机的并联均流电源设计(论文+源码)

2.1 系统的功能及方案设计 两个电源&#xff0c;实现电流均衡效果。 在对系统进行功能设计过程中&#xff0c;主要框图如图2.1所示&#xff0c;系统的控制核心主要是由AT89S52单片机来进行控制&#xff0c;主要的核心控制模块由AT89S52单片机,两路由LM22673构成的DC/DC降压电路…

github与git bash绑定问题

当输入$ ssh -T gitgithub.com 时&#xff0c; 返回ssh: connect to host github.com port 22: Connection refused&#xff0c; 解决方法&#xff1a; 使用 HTTPS 代替 SSH 如果你无法通过 SSH 连接&#xff0c;你可以改用 HTTPS 克隆仓库&#xff0c;而不是 SSH。 使用 git…

从零开始学习人工智能

从零开始学习人工智能可以按照以下步骤进行&#xff1a; 一、了解人工智能的基本概念 学习内容&#xff1a;了解人工智能的定义、发展历程、主要研究方向&#xff08;如机器学习、深度学习、自然语言处理、计算机视觉等&#xff09;、常见应用&#xff08;如语音识别、图像识别…

算法练习——哈希表

一&#xff1a;两数之和 题目要求&#xff1a; 解题思路&#xff1a; 常规思路(暴力方法)&#xff1a;定义两个指针遍历&#xff0c;满足条件时&#xff0c;返回下标。 优化版本:如下图 实现代码&#xff1a; class Solution { public:vector<int> twoSum(vector<in…

如何将网站提交百度收录完整SEO教程

百度收录是中文网站获取流量的重要渠道。本文以我的网站&#xff0c;www.mnxz.fun&#xff08;当然现在没啥流量&#xff09; 为例&#xff0c;详细讲解从提交收录到自动化维护的全流程。 一、百度收录提交方法 1. 验证网站所有权 1、登录百度搜索资源平台 2、选择「用户中心…

ubuntu下一键编译

最近想在ubuntu下练习练习c语言&#xff0c;使用了vscode编写代码&#xff0c;然后使用gcc -test.c -o test && .\test的组合&#xff0c;但是感觉每次都要敲一遍这个指令非常的麻烦&#xff0c;搜索后使用了在文件夹下添加Makefile文件&#xff0c;实现只要敲make就可…