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

重庆主页网站建设wordpress page样式

重庆主页网站建设,wordpress page样式,如何加强校园网站建设,表格布局的网站目录 最小生成树Prim代码模拟流程图 kruskal代码 代码对应实现案例 最小生成树 最小生成树:在无向图中求一棵树(n-1条边,无环,连通所有点),而且这棵树的边权和最小 (ps:可能结果不止…

目录

  • 最小生成树
    • Prim
      • 代码
      • 模拟流程图
    • kruskal
      • 代码
    • 代码对应实现案例

最小生成树

最小生成树:在无向图中求一棵树(n-1条边,无环,连通所有点),而且这棵树的边权和最小
(ps:可能结果不止一种)

Prim

算法思路
Prim算法从一个顶点开始,每次选择与顶点权重最小的边。(“点”为核心,适合稠密图,因为稠密图“边”多)

附带Prim模拟流程图,实际有两个解,具体可看文章最后,但两个解顶点权重总和相同,因此求出一种结果即可,保证实际应用绝对正确,大家也可学习作者是如何进行模拟,期待能够帮助你
(ps:最小生成树模拟量过于庞大,模拟了整整四页,有部分涂改,请见谅,但可保证改正后的一定正确,因此读者可主要看prim算法,另一个算法写的过于繁杂)
看在作者完整模拟的份上,可以求个赞、收藏与关注(比心)

代码

import java.util.Arrays;public class PrimMST {// 定义无穷大常量(用MAX_VALUE的一半防止加法溢出)private static final int INF = Integer.MAX_VALUE / 2;public static int prim(int[][] graph) {int n = graph.length;        // 图的顶点数量int[] dist = new int[n];     // 存储各顶点到最小生成树(MST)的最小距离boolean[] visited = new boolean[n]; // 标记顶点是否已加入MSTArrays.fill(dist, INF);      // 初始化所有距离为无穷大dist[0] = 0;                 // 从顶点0开始,到自身的距离为0int totalWeight = 0;         // MST的总权重// 需要选择n个顶点加入MSTfor (int i = 0; i < n; i++) {// 步骤1:找到未访问顶点中距离MST最近的顶点u,若找到,则添加进最小生成树(如i=4时,只剩V2与V5未访问过,并且此时dist = [0, 5, 1, 4, ,6 , 2],dist[1](V2)到最小生成树的距离为5,dist[4](V5)到最小生成树的距离为6,因此最近的顶点为V2,并添加进最小生成树中)int u = -1; // 初始化为-1表示未找到for (int j = 0; j < n; j++) {// 如果顶点j未访问,且(u未改变 或 j的距离更小)if (!visited[j] && (u == -1 || dist[j] < dist[u])) {u = j; // 更新最近顶点}}// 如果最近顶点的距离仍是INF,说明图不连通if (dist[u] == INF) return -1;visited[u] = true;       // 标记u已加入MSTtotalWeight += dist[u];  // 累加边权重// 步骤2:更新u的邻接顶点到MST的最短距离(如从顶点V1开始时,到顶点V2的距离是6,但i=1的遍历中,找到最近顶点为V3时,此时最小生成树(V1与V3)到V2的最短距离更新为了5)for (int v = 0; v < n; v++) {// 如果v未访问,且u-v有边,且该边比当前记录的距离更小if (!visited[v] && graph[u][v] != INF && graph[u][v] < dist[v]) {dist[v] = graph[u][v]; // 更新距离}}}return totalWeight;}public static void main(String[] args) {// 定义图的邻接矩阵(6个顶点)int[][] graph = {// 0  1  2  3    4    5{0, 6, 1, 5, INF, INF},    // 顶点0的边{6, 0, 5, INF, 3, INF},    // 顶点1的边{1, 5, 0, 4, 6, 4},        // 顶点2的边{5, INF, 4, 0, INF, 2},    // 顶点3的边{INF, 3, 6, INF, 0, 6},    // 顶点4的边{INF, INF, 4, 2, 6, 0}     // 顶点5的边};System.out.println("Prim MST Weight: " + prim(graph));}
}

模拟流程图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

kruskal

加边之前,考虑“加边”的两个端点是不是已经连通,若已连通,则不加(“边”为核心,适合稀疏图)

代码

import java.util.Arrays;
import java.util.Comparator;public class KruskalMST {// 定义边类(起点、终点、权重)static class Edge {int src, dest, weight;public Edge(int src, int dest, int weight) {this.src = src;    // 起点this.dest = dest;  // 终点this.weight = weight; // 边权重}}// 定义并查集的子集类static class Subset {int parent; // 父节点int rank;   // 秩(用于优化)}// 查找根节点(带路径压缩)private static int find(Subset[] subsets, int i) {if (subsets[i].parent != i)subsets[i].parent = find(subsets, subsets[i].parent); // 路径压缩return subsets[i].parent;}// 合并两个集合(按秩合并)private static void union(Subset[] subsets, int x, int y) {int xroot = find(subsets, x);int yroot = find(subsets, y);// 将小秩树合并到大秩树下if (subsets[xroot].rank < subsets[yroot].rank) {subsets[xroot].parent = yroot;} else if (subsets[xroot].rank > subsets[yroot].rank) {subsets[yroot].parent = xroot;} else {subsets[yroot].parent = xroot;subsets[xroot].rank++; // 秩相同时,合并后秩+1}}public static int kruskal(int[][] graph) {int V = graph.length; // 顶点数Edge[] edges = new Edge[V*V]; // 边列表(最坏情况下全连接)int edgeCount = 0;     // 实际边数计数器// 将邻接矩阵转换为边列表for (int i = 0; i < V; i++) {for (int j = i+1; j < V; j++) { // 只遍历上三角避免重复if (graph[i][j] != INF) {   // 如果存在边edges[edgeCount++] = new Edge(i, j, graph[i][j]);}}}// 裁剪边数组到实际大小edges = Arrays.copyOf(edges, edgeCount);// 按边权重升序排序Arrays.sort(edges, Comparator.comparingInt(o -> o.weight));// 初始化并查集Subset[] subsets = new Subset[V];for (int v = 0; v < V; v++) {subsets[v] = new Subset();subsets[v].parent = v; // 初始时每个顶点是自己的父节点subsets[v].rank = 0;    // 初始秩为0}int totalWeight = 0;    // MST总权重int selectedEdges = 0;   // 已选边数int i = 0;              // 当前处理的边索引// 当已选边数 < V-1 且还有未处理的边时继续while (selectedEdges < V - 1 && i < edges.length) {Edge nextEdge = edges[i++]; // 取出当前最小权重边int x = find(subsets, nextEdge.src);  // 查找起点所在集合int y = find(subsets, nextEdge.dest); // 查找终点所在集合// 如果不在同一集合(不会形成环)if (x != y) {union(subsets, x, y);         // 合并集合totalWeight += nextEdge.weight; // 累加权重selectedEdges++;              // 已选边数+1}}return totalWeight;}public static void main(String[] args) {// 定义与Prim相同的图int[][] graph = {{0, 6, 1, 5, INF, INF},{6, 0, 5, INF, 3, INF},{1, 5, 0, 4, 6, 4},{5, INF, 4, 0, INF, 2},{INF, 3, 6, INF, 0, 6},{INF, INF, 4, 2, 6, 0}};System.out.println("Kruskal MST Weight: " + kruskal(graph));}
}

代码对应实现案例

左侧为原无向图,右侧为两种最小生成树的求解结果
在这里插入图片描述

http://www.dtcms.com/a/416854.html

相关文章:

  • 天津北辰做网站怎么用手机做一个网站
  • 长春网站制作费用做英文小说网站
  • 网站推广合同需要缴纳印花税吗哪里找专业做网站的人常熟
  • PS 将照片底色改为黑白打印纸效果
  • 鹤壁市建设局网站横栏建设网站
  • 深入理解Python的`if __name__ == ‘__main__‘`:它到底做了什么?
  • 深圳网站建设龙华信科柳市做网站
  • 做网站怎么赚钱 知乎深圳市房屋管理局官方网站
  • 九江网站建设张旭微信开发者工具使用教程整套
  • wordpress学校官网无锡网站制作优化
  • 基于STM32与influxDB的电力监控系统-2
  • 贵州企业网站开发公司制作投票链接哪家好厂商
  • 成都金融网站建设公司排名设计师网站兼职
  • 微信网站开发登录做会员卡的网站在线制作
  • 商城网站支付端怎么做的html文档模板
  • 网站移动端建设徐州手机网站建设
  • 可以做旅行计划的网站在韩国申请网站域名需要什么
  • SpatialVLA
  • 网站降权查下体验营销
  • 昌邑营销型网站建设c4d培训机构推荐
  • 网站头部psflash怎么制作网站
  • 能源网站模板电商网站建设合同模板
  • 做民宿网站的系统可行性网络营销推广方法十种
  • 浙江网站设计公司电话营销管理咨询
  • 个人网站设计流程图自动全屏网站模板
  • 化学产品在哪个网站做推广最好百度系app有哪些
  • 网站制作培训价格云霄城乡建设局网站
  • 电子商务公司设计网站建设网站建设公司 优势
  • 武城网站建设电话网页设计个人总结
  • 网站开发公司可行报告比较知名的网站建设公司