图论基础知识 并查集/例题

这篇具有很好参考价值的文章主要介绍了图论基础知识 并查集/例题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

并查集

学习记录自代码随想录

并查集可以解决的问题:

并查集常用来解决连通性问题。
判断两个元素是否在同一个集合里的时候,要想到用并查集。
并查集主要有两个功能:
1.将两个元素添加到一个集合中;
2.判断两个元素在不在同一个集合。

代码模板

int n = 1005;  // 节点数量大于题目要求一点即可
vector<int> father(n, 0);

// 并查集初始化
void init(){
	for(int i = 0; i < n; i++){
		father[i] = i;
	}
}

// 并查集寻根过程
int find(int u){
	return u == father[u] ? u : father[u] = find(father[u]);
}

// 判断u和v是否是同一个根,同一个根则在同一个集合
bool isSameRoot(int u, int v){
	u = find(u);
	v = find(v);
	return u == v;
}

// 将v-u这条边加入并查集
void join(int u, int v){
	u = find(u);
	v = find(v);
	// 同一个根则说明在同一个集合,不需要节点相连
	if(u == v) return;
	father[v] = u;
}

例题:20240410 Huawei机考文章来源地址https://www.toymoban.com/news/detail-857630.html

//2.相似图片分类
//小明想要处理一批图片,将相似的图片分类。他首先对图片的特征采样,得到图片之间的相似度,然后按照以下规则判断图片是否可以归为一类 :
//
//1)相似度 > 0表示两张图片相似,
//2)如果A和B相似,B和C相似,但A和C不相似。那么认为A和C间接相似,可以把ABC归为一类,但不计算AC的相似度
//3)如果A和所有其他图片都不相似,则A自己归为一类,相似度为0.
// 给定一个大小为NxN的矩阵M存储任意两张图片的相似度,
//M[i][j]即为第i个图片和第j个图片的相似度,请按照"从大到小”的顺序返回每个相似类中所有图片的相似度之和。
//
//解答要求
//时间限制 : C / C++ 1000ms, 其他语言 : 2000ms内存限制 : C / C++ 256MB, 其他语言 : 512MB
//
//输入
//第一行一个数N,代表矩阵M中有N个图片,下面跟着N行,每行有N列数据,空格分隔(为了显示整齐,空格可能为多个) 代表N个图片之间的相似度。
//约束:
//1.0 < N <= 900
//2.0 <= M[i][j] <= 100, 输入保证M[i][i] = 0, M[i][j] = M[j][i]
//输出
//每个相似类的相似度之和。格式为 : 一行数字,分隔符为1个空格。

//样例
//
//输入
//5
//0 0 50 0 0
//0 0 0 25 0
//50 0 0 0 15
//0 25 0 0 0
//0 0 15 0 0
//输出
//65 25

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <sstream>
#include <map>

using namespace std;

class Solution {
public:
	/*int n;
	Solution(int x) : n(x){}*/\
	// 初始化
	vector<int> init(vector<int>& father) {
		for (int i = 0; i < father.size(); i++) {
			father[i] = i;
		}
		return father;
	}
	// 查找根节点
	int find(int x, vector<int>& father) {
		return father[x] == x ? x : father[x] = find(father[x], father);
	}
	// 判断是否在一个集合中
	bool isSameRoot(int u, int v, vector<int>& father) {
		u = find(u, father);
		v = find(v, father);
		return u == v;
	}
	// 将u<----v边加入
	void join(int u, int v, vector<int>& father) {
		u = find(u, father);
		v = find(v, father);
		if (u == v) return;
		father[v] = u;
	}

	vector<int> getSimilarity(vector<vector<int>>& M, int N) {
		vector<int> father(N, 0);
		father = init(father);
		for (int i = 0; i < N; i++) {
			for (int j = i + 1; j < N; j++) {
				if (M[i][j] > 0) {
					join(i, j, father);
				}
			}
		}
		map<int, vector<int>> root_set;
		for (int i = 0; i < N; i++) {
			root_set[find(i, father)].push_back(i);
		}
		vector<int> res;
		for (const auto& it : root_set) {
			int cnt = 0;
			for (int i = 0; i < it.second.size(); i++) {
				for (int j = i + 1; j < it.second.size(); j++) {
					cnt += M[it.second[i]][it.second[j]];
				}
			}
			res.push_back(cnt);
		}
		return res;
	}
};

int main() {

	int N;
	cin >> N; cin.ignore();
	int temp = N;
	vector<vector<int>> M;
	while (temp--) {
		string line;
		getline(cin, line);
		vector<int> nums;
		istringstream iss(line);
		string k;
		while (iss >> k) {
			nums.push_back(stoi(k));
		}
		M.push_back(nums);
	}

	Solution sol;
	vector<int> res = sol.getSimilarity(M, N);
	for (int i = 0; i < res.size() - 1; i++) {
		cout << res[i] << ' ';
	}
	cout << res[res.size() - 1];

	return 0;
}

到了这里,关于图论基础知识 并查集/例题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 图论:并查集的合并、判断和求节点

     所谓并查集就是可以画图理解 假如说我们想要构建一个树(也是图),要求1-2,2-4,1-3 在构另一个树,要求5-6,6-7,5-8 1是2的头结点,2是4的头结点,以此类推 下面要求去将5连接到1上,就是我下面要讲的,其实上面的子节点的连接也是如此的。 简单并查集例题: 一共有 n 个数

    2024年01月18日
    浏览(27)
  • AcWing 算法基础课二 数据结构 链表 栈 队列 并查集 哈希表

    链表题目:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 AcWing. 826.单链表 双链表 AcWing 827.双链表 AcWing 828.模拟栈 AcWing 3302.表达式求值 AcWing 829. 模拟队列 AcWing 830.单调栈 AcWing 154.滑动窗口 AcWing 831. KMP字符串 AcWing 835. Trie字符串统计 AcWing 143. 最大异或对 AcWing 836.合并集合

    2024年02月15日
    浏览(30)
  • 代码随想录图论并查集 第七天 | 685.冗余连接II

    代码随想录图论并查集 第七天 | 685.冗余连接II 一、685.冗余连接II 题目链接:https://leetcode.cn/problems/redundant-connection-ii/ 思路:684.冗余连接中是连通且无环的无向图可直接使用并查集模板,如果想判断集合中是否有环,且那条边构成环,只需要每次加入并查集之前先判断一下是

    2024年02月06日
    浏览(38)
  • 并查集算法实现

    牛客测试链接 并查集(Disjoint Set)是一种用于处理集合合并与查询问题的数据结构。它支持两种操作:合并(Union)和查询(Find)。 合并操作将两个不相交的集合合并为一个集合,查询操作用于判断两个元素是否属于同一个集合。 本文将介绍并查集算法的实现,并给出一个

    2024年01月25日
    浏览(31)
  • 图论专栏一《图的基础知识》

    图论(Graph Theory)是数学的一个分支 。它以图为研究对象。图论中的图是由若干给定的点及连接两点的线所构成的图形,这种图形通常用来描述某些实体之间的某种特定关系,用点代表实体,用连接两点的线表示两个实体间具有的某种关系。 相比矩阵、张量、序列等结构,

    2024年02月03日
    浏览(25)
  • 图论及其应用(基础知识)(1)(数学建模基础速成)

    能否从任一陆地出发通过每座桥恰好一次而 回到出发点? 你要是自己做过,就会显而易见的发现这道题是 没有答案 的(遵守规则以及图形规定的情况下) 欧拉就这个问题说过: 如果每块陆地所连接的桥都是 偶数 座,则从任一陆地出发,必能通过每座桥恰好一次而回到出

    2023年04月08日
    浏览(22)
  • 【数据结构与算法】并查集

    并查集是一个树形结构,所谓的并查,就是 当我们有了一个节点,我们就能知道这个节点属于哪个集合 。 举个例子理解以下:战国时期有很多国家,它们会互相打仗,那么现在有两个互相不认识的人,如何知道对方是敌是友呢? 现在有一种方法:每个国家都有一个大王,我

    2023年04月15日
    浏览(24)
  • Peter算法小课堂—并查集

    我们先来看太戈编程467题 攀亲戚 题目描述: 最近你发现自己和古代一个皇帝长得很像:都有两个鼻子一个眼睛,你想知道这皇帝是不是你的远方亲戚,你是不是皇亲国戚。目前你能掌握的信息有m条,关于n个人:第i条信息包含两个人的编号ai,bi,表示ai和bi是亲戚。你的编号

    2024年01月18日
    浏览(36)
  • 算法刷题day34:并查集

    今天写的题集是并查集,其实感觉有两个难点,一个是,要维护多余的信息和路径压缩,另一个难点则是抽象出来合并集合的这个操作,还是要不断地练习,看别人怎么去做,加油! 标签:并查集 思路: 模板题,没啥说的 题目描述: 示例代码: 标签:并查集 思路: 其实

    2024年03月21日
    浏览(53)
  • 算法与数据结构(九)--并查集

    1.处理对象:Disjoint Set,即“不相交集合”。 在一些应用问题中,需将n个不同的元素划分成一组不相交的集合。开始时,每个元素自成一个单元素集合,然后按一定顺序将属于同一组元素的集合合并。其间要反复用到查询某个元素属于哪个集合的运算。适合于描述这类问题的

    2024年02月10日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包