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

网站版建设数据查询网站

网站版建设,数据查询网站,wordpress中css类,wordpress设置cdn文章目录 最小生成树介绍朴素Prim算法算法思路⭐例题:858. Prim算法求最小生成树 Kruskal算法算法思路⭐例题:859. Kruskal算法求最小生成树 最小生成树介绍 最小生成树 有关树的定义 生成子图:生成子图是从原图中选取部分节点以及这些节点…

文章目录

  • 最小生成树介绍
  • 朴素Prim算法
    • 算法思路⭐
    • 例题:858. Prim算法求最小生成树
  • Kruskal算法
    • 算法思路⭐
    • 例题:859. Kruskal算法求最小生成树

最小生成树介绍

最小生成树
有关树的定义

生成子图:生成子图是从原图中选取部分节点以及这些节点之间的边所组成的图。生成子图中的所有节点和边都必须在原图中存在。

生成树:一个连通无向图生成子图,同时要求是树。也即在图的边集中选择 n - 1 条,将所有顶点连通。

我们定义无向连通图的 最小生成树(Minimum Spanning Tree,MST)为边权和最小的生成树

注意:只有连通图才有生成树,而对于非连通图,只存在生成森林。

在这里插入图片描述

朴素Prim算法

算法思路⭐

算法流程和 Dijkstra 算法非常相似。

Dijkstra 算法是用 t 更新其它点到起点的距离,而 Prim 用 t 更新其它点到 集合 的距离。

在这里插入图片描述

初始时各个点到集合的距离设置为 INF

循环 n 次,每次循环找到当前没在集合(集合就是最小生成树中节点的集合)且距离集合最近的节点。

将当前最近的节点 t 加入最小生成树中,然后使用 t 更新其它所有点(1~n)到集合之间的距离。

时间复杂度是: O ( n 2 + m ) O(n^2 + m) O(n2+m)

例题:858. Prim算法求最小生成树

https://www.acwing.com/problem/content/description/860/

在这里插入图片描述

注意:图中可能存在重边和自环。
重边是指连接同一对顶点的多条边。在处理重边的时候,我们应当只保留权重最小的那条边,其他的边应当被忽略。
自环是指从一个顶点指向自身的边。在最小生成树中,自环是没有意义的,因为我们可以直接忽略这样的边。实际上,对于 Prim 算法,我们应当在初始化阶段,忽略这些自环,即将其赋予无穷大的权重。

另外注意图是无向图,因此在建图时应当同时更新 g [ u ] [ v ] = g [ v ] [ u ] = M a t h . m i n ( g [ u ] [ v ] , w ) ; g[u][v] = g[v][u] = Math.min(g[u][v], w); g[u][v]=g[v][u]=Math.min(g[u][v],w);

import java.util.*;public class Main {static final int INF = 0x3f3f3f3f;public static void main(String[] args){Scanner scanner = new Scanner(System.in);int n = scanner.nextInt(), m = scanner.nextInt();// 边数很多,所以使用邻接矩阵来存储int[][] g = new int[n + 1][n + 1];for (int i = 1; i <= n; ++i) {Arrays.fill(g[i], INF);     // 对于自环也应该把距离设置成INF}for (int i = 0; i < m; ++i) {int u = scanner.nextInt(), v = scanner.nextInt(), w = scanner.nextInt();g[u][v] = g[v][u] = Math.min(g[u][v], w);   // 是无向图,所以g[u][v] = g[v][u]都要更新}// 求最小生成树的树边权重之和int sum = prim(g);System.out.println(sum > INF / 2? "impossible": sum);}static int prim(int[][] g) {int n = g.length - 1, res = 0;boolean[] st = new boolean[n + 1];      // 存储每个点是否已经在生成树中了int[] dis = new int[n + 1];             // 存储其它点到当前最小生成树的距离Arrays.fill(dis, 0x3f3f3f3f);       // 初始时距离都是 INFfor (int i = 0; i < n; ++i) {// 找到当前和集合最近且不在集合中的节点tint t = -1;for (int j = 1; j <= n; ++j) {if (!st[j] && (t == -1 || dis[t] > dis[j])) t = j;}if (i != 0 && dis[t] == INF) return INF;    // 如果第一个节点没有把任何节点到最小生成树的距离变小// 将 t 加入最小生成树中去if (i != 0) res += dis[t];                  // 注意判断树中的第一个节点是不会贡献边权和的st[t] = true;// 使用 t 到各个节点的距离 更新 各个节点到当前最小生成树的距离for (int j = 1; j <= n; ++j) {dis[j] = Math.min(dis[j], g[t][j]);}}return res;}
}

Kruskal算法

算法思路⭐

  1. 先将所有边按权重从小到大排序
  2. 枚举每条边 a ,b , w。如果 a, b 不连通就把这条边加入集合,即加入最小生成树。

在这里插入图片描述

如果使用 O ( m log ⁡ m ) O(m\log m) O(mlogm) 的排序算法,并且使用 O ( m α ( m , n ) ) O(m\alpha(m, n)) O(mα(m,n)) O ( m log ⁡ n ) O(m\log n) O(mlogn) 的并查集,就可以得到时间复杂度为 O ( m log ⁡ m ) O(m\log m) O(mlogm) 的 Kruskal 算法。

例题:859. Kruskal算法求最小生成树

https://www.acwing.com/activity/content/problem/content/925/
在这里插入图片描述

import java.util.*;public class Main {static final int INF = 0x3f3f3f3f, N = 100005;static int[] p = new int[N];static int n;public static void main(String[] args){Scanner scanner = new Scanner(System.in);n = scanner.nextInt();int m = scanner.nextInt();// 记录所有的 m 个边int[][] edges = new int[m][3];for (int i = 0; i < m; ++i) {edges[i][0] = scanner.nextInt();edges[i][1] = scanner.nextInt();edges[i][2] = scanner.nextInt();}int res = kruskal(edges);System.out.println(res == INF? "impossible": res);}static int find(int x) {if (x != p[x]) p[x] = find(p[x]);return p[x];}static int kruskal(int[][] edges) {// 按照权重升序排序Arrays.sort(edges, (a, b) -> a[2] - b[2]);Arrays.setAll(p, e -> e);       // 初始化并查集int res = 0, cnt = 0;for (int[] edge: edges) {int x = edge[0], y = edge[1];if (find(x) != find(y)) {p[find(x)] = find(y);res += edge[2];cnt++;}}if (cnt < n - 1) return INF;return res;}
}
http://www.hrbkazy.com/news/15338.html

相关文章:

  • 建设银行观澜支行网站宜兴百度推广公司
  • 好的建站网站大连今日新闻头条
  • 网站建设能够不同地方百度人工客服
  • 营销网站制作免费咨询谷歌seo是什么意思
  • 胶州网站开发百度收录最新方法
  • 聊城集团网站建设怎么推广淘宝店铺
  • 网站建设的资金风险网络营销心得体会1000字
  • 购物网站设计意义信息流广告投放渠道
  • 保山市住房和城乡建设厅网站安卓优化大师历史版本
  • 石家庄网站推广软件100种找客户的方法
  • 站群cms百度的网址是多少
  • 上门服务做眉毛是哪个网站淘宝营销推广方案
  • 阿里巴巴网站运营怎么做今日热点新闻头条排行榜
  • 成都营销型网站建设合肥网络公司
  • 自己做彩票网站合法吗深圳推广公司哪家正规
  • 公司网站服务商sq网站推广
  • 网站建设素材模板下载谷歌网页版入口在线
  • 工业云网站建设网站怎么优化关键词排名
  • 做一个网站怎么做数据库长尾词优化外包
  • 纷享销客crm管理系统二十条优化措施原文
  • 应用商店下载安装打开seo建站公司
  • 买一个网站需要多少钱百度学术官网入口
  • 如何建设一个静态网站营销模式有几种
  • 网站建设中正在为您转怎样搭建一个网站
  • 房地产手机网站模板知名网站
  • 五年级信息做网站的软件乐云seo官网
  • 电商网站建设参考文献爱站工具包的模块有哪些
  • 深圳网站建设资讯关键词优化骗局
  • 网站关键词怎么做排名靠前百度链接提交入口
  • 如何制作企业网站百度网站app