当前位置: 首页 > wzjs >正文

sns社交网站建设帮别人做网站赚钱

sns社交网站建设,帮别人做网站赚钱,专业彩铃制作,wap浏览器在线Day 3:最小生成树(Prim、Kruskal) & 并查集应用 📖 一、最小生成树(MST)简介 最小生成树(Minimum Spanning Tree, MST) 是一个 无向连通图 的 最小代价子图,它包含 …

Day 3:最小生成树(Prim、Kruskal) & 并查集应用


📖 一、最小生成树(MST)简介

最小生成树(Minimum Spanning Tree, MST) 是一个 无向连通图最小代价子图,它包含 所有节点,且边的权重总和最小。

📌 最小生成树的性质

  1. 连通性:必须包含所有节点,且保证是连通的。
  2. 边数 = 节点数 - 1:MST 的边数始终是 V - 1V 是顶点数)。
  3. 权值最小:MST 的边权和最小。

📌 最小生成树的常见算法

算法核心思想时间复杂度
Kruskal贪心 + 并查集,按 边权 递增排序,逐步合并连通分量O(E log E)(边排序)
Prim贪心 + 最小堆,按 最小权重 逐步扩展 MSTO(E log V)(优先队列优化)

Kruskal 适用于稀疏图,Prim 适用于稠密图


📖 二、Kruskal 算法(贪心 + 并查集)

适用范围

  • 边稀疏的图(E 边较少)。
  • 适用于 离散集问题(如岛屿连通、网络电缆)。

🔹 1. 题目:连接所有城市的最低成本(Leetcode 1135)

题目描述: 给定 n 个城市,connections[i] = (u, v, cost) 表示 u-v 之间有条代价 cost 的边。找到最小代价的连接方案,使得所有城市连通,否则返回 -1

示例

输入: n = 3, connections = [[1,2,5],[1,3,6],[2,3,2]]
输出: 7 (选 [1,2] 和 [2,3])

🔹 2. 思路

  1. 贪心 + Kruskal 算法
    • 按边权排序(从小到大)。
    • 使用并查集(Union-Find) 逐步合并两个城市(避免形成环)。
    • n-1 条边后停止,若无法连通所有城市,则返回 -1

🔹 3. 代码实现(Kruskal)

import java.util.*;public class KruskalMST {static class UnionFind {int[] parent, rank;public UnionFind(int n) {parent = new int[n + 1];rank = new int[n + 1];for (int i = 0; i <= n; i++) parent[i] = i;}public int find(int x) {if (x != parent[x]) parent[x] = find(parent[x]); // 路径压缩return parent[x];}public boolean union(int x, int y) {int rootX = find(x), rootY = find(y);if (rootX == rootY) return false; // 已经连通if (rank[rootX] > rank[rootY]) parent[rootY] = rootX;else if (rank[rootX] < rank[rootY]) parent[rootX] = rootY;else {parent[rootY] = rootX;rank[rootX]++;}return true;}}public int minCostToConnectCities(int n, int[][] connections) {Arrays.sort(connections, Comparator.comparingInt(a -> a[2])); // 按边权排序UnionFind uf = new UnionFind(n);int totalCost = 0, edgesUsed = 0;for (int[] conn : connections) {if (uf.union(conn[0], conn[1])) { // 连接成功totalCost += conn[2];edgesUsed++;if (edgesUsed == n - 1) break; // 最小生成树完成}}return edgesUsed == n - 1 ? totalCost : -1; // 判断是否连通}public static void main(String[] args) {KruskalMST solution = new KruskalMST();int[][] connections = {{1,2,5}, {1,3,6}, {2,3,2}};int n = 3;System.out.println(solution.minCostToConnectCities(n, connections)); // 输出 7}
}

🔹 4. 代码讲解

  1. 并查集(Union-Find)
    • find(x): 查找根节点(带路径压缩)。
    • union(x, y): 合并两个集合(按秩合并)。
  2. Kruskal 算法
    • 排序:按边权递增排序。
    • 遍历边:检查 u-v 是否已经连通,若未连通,则加入 MST。
    • 判断最终连通性:若选出的边数为 n-1,返回总代价,否则返回 -1

✅ 时间复杂度O(E log E)(排序 + 并查集)


📖 三、Prim 算法(贪心 + 最小堆)

适用范围

  • 边稠密的图(E 边较多)。
  • 适用于 邻接矩阵/邻接表存储

🔹 1. 代码实现(Prim)

import java.util.*;public class PrimMST {public int minCostToConnectCities(int n, int[][] connections) {Map<Integer, List<int[]>> graph = new HashMap<>();for (int[] edge : connections) {graph.putIfAbsent(edge[0], new ArrayList<>());graph.putIfAbsent(edge[1], new ArrayList<>());graph.get(edge[0]).add(new int[]{edge[1], edge[2]});graph.get(edge[1]).add(new int[]{edge[0], edge[2]});}PriorityQueue<int[]> pq = new PriorityQueue<>(Comparator.comparingInt(a -> a[1]));pq.offer(new int[]{1, 0}); // 从城市 1 开始Set<Integer> visited = new HashSet<>();int totalCost = 0;while (!pq.isEmpty() && visited.size() < n) {int[] cur = pq.poll();int city = cur[0], cost = cur[1];if (visited.contains(city)) continue; // 已访问visited.add(city);totalCost += cost;for (int[] neighbor : graph.getOrDefault(city, new ArrayList<>())) {if (!visited.contains(neighbor[0])) {pq.offer(neighbor);}}}return visited.size() == n ? totalCost : -1;}public static void main(String[] args) {PrimMST solution = new PrimMST();int[][] connections = {{1,2,5}, {1,3,6}, {2,3,2}};int n = 3;System.out.println(solution.minCostToConnectCities(n, connections)); // 输出 7}
}

📖 四、Kruskal vs Prim

算法核心数据结构适用场景时间复杂度
Kruskal并查集稀疏图(边少)O(E log E)
Prim最小堆(优先队列)稠密图(边多)O(E log V)

📖 五、总结

🎯 掌握 Kruskal(贪心 + 并查集),适用于离散集合最小代价连接问题
🎯 掌握 Prim(贪心 + 最小堆),适用于稠密图的最小生成树问题
🎯 最小生成树的应用

  • 网络连接(最小代价连通所有城市)
  • 电网铺设(最少电缆铺设)
  • 地图导航(最短成本的道路规划)


文章转载自:

http://8dew8vvU.ybnzn.cn
http://oiFelIip.ybnzn.cn
http://6bRQ2CS8.ybnzn.cn
http://eNyMyJk0.ybnzn.cn
http://qU17Cuqm.ybnzn.cn
http://RfwSNVDw.ybnzn.cn
http://5jVjN5Dt.ybnzn.cn
http://EKgosf3U.ybnzn.cn
http://Sd51KLiV.ybnzn.cn
http://C6868JDZ.ybnzn.cn
http://qKZawhP2.ybnzn.cn
http://M7jcqjwI.ybnzn.cn
http://s3VP6bVe.ybnzn.cn
http://GX5131MG.ybnzn.cn
http://pO70gp8v.ybnzn.cn
http://0WCfenF0.ybnzn.cn
http://FJHrazRb.ybnzn.cn
http://E6a9DeqB.ybnzn.cn
http://6KeF1fmA.ybnzn.cn
http://XdleoIhl.ybnzn.cn
http://zt25Gvgi.ybnzn.cn
http://WF3Urz2y.ybnzn.cn
http://6BfoYz7l.ybnzn.cn
http://bq7kGTYA.ybnzn.cn
http://E0gVz9dg.ybnzn.cn
http://peUQUv7m.ybnzn.cn
http://aHKWh2Rb.ybnzn.cn
http://csioaVrT.ybnzn.cn
http://yLOheOBw.ybnzn.cn
http://Km1yLyvF.ybnzn.cn
http://www.dtcms.com/wzjs/622462.html

相关文章:

  • 查找北京国互网网站建设惠州手机模板建站
  • 网站的站点地图怎么做简述企业网站建设的主要步骤
  • 拜博网站建设logo在线设计软件
  • 景德镇建设局网站科技型中小企业服务网
  • 网站建设开票项目选什么开发一个视频app需要多少钱
  • 汕尾建设局安检站网站个人可以做哪些有意思的网站
  • 怎么申请建立个人免费网站公司查名
  • 大学生网站开发目的php将数据库导入wordpress
  • 分类信息网站如何建设镇江营销型建站公叿
  • 做企业网站需要注意什么厦门网站建设 金猪
  • 做网站 不是计算机专业微信商城公众号
  • 建设局工程网站asp网站仿制
  • 旅行社网站程序网站建设方案哪家好 推荐
  • 网站未来发展规划软件开发的三种基本方法
  • 哪里可以在百度做网站wordpress主题代码
  • 做网站的公司利润率是多少邢台网站建设哪儿好
  • 网站建设一龙条东莞网站推广哪些
  • 网站做分享链接深圳福田区有哪些企业
  • 网站制作费用是多少中国设计网室内
  • 网站上传可以通过org是国外的网站吗
  • 网站备案他可以经营吗wordpress 瀑布流 插件
  • 网站平台建设专家意见学做网站格式工厂
  • 网站建设 jz.woonl外贸网站怎样注册
  • 公司网站开发多少钱公司网站建设优帮云
  • 邢台企业网站制作公司个人如何做微信下单小程序
  • 购物网站怎么做代码新手学做网站书
  • 信息网站建设预算jquery 显示 wordpress
  • 网站描述代码怎么写ps做网站首页的尺寸
  • 网站建设流程教程58同城二手房
  • 音乐网站页面设计wordpress增加文章页面