徐州公司网站建设优秀室内设计作品
web/
2025/10/2 22:19:50/
文章来源:
徐州公司网站建设,优秀室内设计作品,网页图片怎么打印出来,上海wordpress【算法日志】图论: 并查集及其简单应用
并查集概论
并查集是一种算法设计思想#xff0c;通过判断两个元素是否在同一个集合里#xff0c;常用来解决一些和图相关的连通性问题。
并查集主要有以下两个功能#xff1a;
将两个元素添加到一个集合中。判断两个元素是否是在…【算法日志】图论: 并查集及其简单应用
并查集概论
并查集是一种算法设计思想通过判断两个元素是否在同一个集合里常用来解决一些和图相关的连通性问题。
并查集主要有以下两个功能
将两个元素添加到一个集合中。判断两个元素是否是在一个集合之中(这一功能够有效判断是否成环)。
主要思想
通过创建一个数组用来保每个点的最老根节点以此来实现并查集的各种功能。
具体模板如下
int n 1005; // n根据题目中节点数量而定一般比节点数量大一点就好
vectorint father vectorint (n, 0); // C里的一种数组结构
// 并查集初始化
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 isSame(int u, int v) {u find(u);v find(v);return u v;
}
// 将v-u 这条边加入并查集
void join(int u, int v) {u find(u); // 寻找u的根v find(v); // 寻找v的根if (u v) return ; // 如果发现根相同则说明在一个集合不用两个节点相连直接返回father[v] u;
}简单应用
leetcode 1971:寻找是否存在路径
本题是双向图只要始末点相连就存在有效路径因此只需要将合并树判断始末节点的最老根节点是否一样就行。
具体示例代码如下 void Init(vectorint f, const int n){for (int i 0; i n; i)f[i] i;}int find(vectorint f, int v){return v f[v] ? v : find(f, f[v]);}bool isSame(vectorint f, int v, int u){v find(f, v);u find(f, u);return v u;}void join(vectorint f, int v, int u){v find(f, v);u find(f, u);if (v ! u)f[u] v;}bool validPath(int n, vectorvectorint edges, int source, int destination){vectorvectorint path;vectorint father(n 1, 0);Init(father, n 1);int size edges.size();for (int i 0; i size; i)join(father, edges[i][0], edges[i][1]);return isSame(father, source, destination);}leetcode 648: 冗余连接
本题要连接的点在连接前存在共同根节点那么连接该两点就会形成环路因此需要移除的边就是以这两点为端点的边。
具体示例代码如下 void Init(vectorint f, const int n){for (int i 0; i n; i)f[i] i;}int find(vectorint f, int v){return v f[v] ? v : find(f, f[v]);}bool isSame(vectorint f, int v, int u){v find(f, v);u find(f, u);return v u;}void join(vectorint f, int v, int u){v find(f, v);u find(f, u);if (v ! u)f[u] v;}vectorint findRedundantConnection(vectorvectorint edges){int n edges.size();vectorint father(n 1, 0);Init(father, n 1);for (int i 0; i n; i){if (isSame(father, edges[i][0], edges[i][1]))return { edges[i][0], edges[i][1] };join(father, edges[i][0], edges[i][1]);}return {};}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/85853.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!