🌓 天气与日历 切换到窄版

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 145|回复: 0

[其它教程] 最小生成树算法,分别用C语言,C++,java,python编写出来

[复制链接]

2972

主题

4

回帖

3044

积分

管理员

积分
3044
发表于 2024-2-27 12:33:07 | 显示全部楼层 |阅读模式

最小生成树问题,简称MST,指给定一个带权的无向连通图,如果选取一棵生成树,使树上所有边上权的总和为最小,这叫最小生成树。



图有N个顶点,就一定有N-1条边,且必须包含所有顶点,所有边都在图中。解决最小生成树问题的算法主要有普利姆算法和克鲁斯卡尔算法。


最小生成树算法,分别用C语言,C++,java,python编写出来
当涉及最小生成树算法时,可以使用多种编程语言来实现。以下是使用C语言、C++、Java和Python编写最小生成树算法的示例:
1.**C语言示例:**


  1. #include <stdio.h>
  2. #include <stdbool.h>
  3. #include <limits.h>
  4. #define V 5
  5. int minKey(int key[], bool mstSet[]) {
  6.     int min = INT_MAX, min_index;
  7.      for (int v = 0; v < V; v++) {
  8.         if (mstSet[v] == false && key[v] < min) {
  9.             min = key[v];
  10.             min_index = v;
  11.         }
  12.     }
  13.      return min_index;
  14. }
  15. void printMST(int parent[], int graph[V][V]) {
  16.     printf("Edge \tWeight\n");
  17.     for (int i = 1; i < V; i++) {
  18.         printf("%d - %d \t%d \n", parent[i], i, graph[i][parent[i]]);
  19.     }
  20. }
  21. void primMST(int graph[V][V]) {
  22.     int parent[V];
  23.     int key[V];
  24.     bool mstSet[V];
  25.      for (int i = 0; i < V; i++) {
  26.         key[i] = INT_MAX;
  27.         mstSet[i] = false;
  28.     }
  29.      key[0] = 0;
  30.     parent[0] = -1;
  31.      for (int count = 0; count < V - 1; count++) {
  32.         int u = minKey(key, mstSet);
  33.         mstSet[u] = true;
  34.          for (int v = 0; v < V; v++) {
  35.             if (graph[u][v] && mstSet[v] == false && graph[u][v] < key[v]) {
  36.                 parent[v] = u;
  37.                 key[v] = graph[u][v];
  38.             }
  39.         }
  40.     }
  41.      printMST(parent, graph);
  42. }

复制代码
int main() {
    int graph[V][V] = {
        {0, 2, 0, 6, 0},
        {2, 0, 3, 8, 5},
        {0, 3, 0, 0, 7},
        {6, 8, 0, 0, 9},
        {0, 5, 7, 9, 0}
    };
     primMST(graph);
     return 0;
}



2.**C++示例:**

  1. #include <iostream>
  2. #include <climits>
  3. using namespace std;
  4. #define V 5
  5. int minKey(int key[], bool mstSet[]) {
  6.     int min = INT_MAX, min_index;
  7.      for (int v = 0; v < V; v++) {
  8.         if (mstSet[v] == false && key[v] < min) {
  9.             min = key[v];
  10.             min_index = v;
  11.         }
  12.     }
  13.      return min_index;
  14. }
  15. void printMST(int parent[], int graph[V][V]) {
  16.     cout << "Edge \tWeight\n";
  17.     for (int i = 1; i < V; i++) {
  18.         cout << parent[i] << " - " << i << "\t" << graph[i][parent[i]] << endl;
  19.     }
  20. }
  21. void primMST(int graph[V][V]) {
  22.     int parent[V];
  23.     int key[V];
  24.     bool mstSet[V];
  25.      for (int i = 0; i < V; i++) {
  26.         key[i] = INT_MAX;
  27.         mstSet[i] = false;
  28.     }
  29.      key[0] = 0;
  30.     parent[0] = -1;
  31.      for (int count = 0; count < V - 1; count++) {
  32.         int u = minKey(key, mstSet);
  33.         mstSet[u] = true;
  34.          for (int v = 0; v < V; v++) {
  35.             if (graph[u][v] && mstSet[v] == false && graph[u][v] < key[v]) {
  36.                 parent[v] = u;
  37.                 key[v] = graph[u][v];
  38.             }
  39.         }
  40.     }
  41.      printMST(parent, graph);
  42. }

复制代码
int main() {
    int graph[V][V] = {
        {0, 2, 0, 6, 0},
        {2, 0, 3, 8, 5},
        {0, 3, 0, 0, 7},
        {6, 8, 0, 0, 9},
        {0, 5, 7, 9, 0}
    };
     primMST(graph);
     return 0;
}



3.**Java示例:**

  1. import java.util.Arrays;
  2. class MST {
  3.     private static final int V = 5;
  4.      int minKey(int key[], Boolean mstSet[]) {
  5.         int min = Integer.MAX_VALUE, min_index = -1;
  6.          for (int v = 0; v < V; v++) {
  7.             if (mstSet[v] == false && key[v] < min) {
  8.                 min = key[v];
  9.                 min_index = v;
  10.             }
  11.         }
  12.          return min_index;
  13.     }
  14.      void printMST(int parent[], int graph[][]) {
  15.         System.out.println("Edge \tWeight");
  16.         for (int i = 1; i < V; i++) {
  17.             System.out.println(parent[i] + " - " + i + "\t" + graph[i][parent[i]]);
  18.         }
  19.     }
  20.      void primMST(int graph[][]) {
  21.         int parent[] = new int[V];
  22.         int key[] = new int[V];
  23.         Boolean mstSet[] = new Boolean[V];
  24.          Arrays.fill(key, Integer.MAX_VALUE);
  25.         Arrays.fill(mstSet, false);
  26.          key[0] = 0;
  27.         parent[0] = -1;
  28.          for (int count = 0; count < V - 1; count++) {
  29.             int u = minKey(key, mstSet);
  30.             mstSet[u] = true;
  31.              for (int v = 0; v < V; v++) {
  32.                 if (graph[u][v] != 0 && mstSet[v] == false && graph[u][v] < key[v]) {
  33.                     parent[v] = u;
  34.                     key[v] = graph[u][v];
  35.                 }
  36.             }
  37.         }
  38.          printMST(parent, graph);
  39.     }
  40.    
  41. }
复制代码
public static void main(String[] args) {
        int graph[][] = {
            { 0, 2, 0, 6, 0 },
            { 2, 0, 3, 8, 5 },
            { 0, 3, 0, 0, 7 },
            { 6, 8, 0, 0, 9 },
            { 0, 5, 7, 9, 0 }
        };
         MST mst = new MST();
        mst.primMST(graph);
    }



4.**Python示例:**

  1. class MST:
  2.     def __init__(self, vertices):
  3.         self.V = vertices
  4.         self.graph = [[0 for _ in range(vertices)] for _ in range(vertices)]
  5.      def minKey(self, key, mstSet):
  6.         min = float("inf")
  7.         min_index = -1
  8.          for v in range(self.V):
  9.             if key[v] < min and mstSet[v] == False:
  10.                 min = key[v]
  11.                 min_index = v
  12.          return min_index
  13.      def printMST(self, parent):
  14.         print("Edge \tWeight")
  15.         for i in range(1, self.V):
  16.             print(parent[i], "-", i, "\t", self.graph[i][parent[i]])
  17.      def primMST(self):
  18.         key = [float("inf")] * self.V
  19.         parent = [None] * self.V
  20.         mstSet = [False] * self.V
  21.          key[0] = 0
  22.         parent[0] = -1
  23.          for _ in range(self.V - 1):
  24.             u = self.minKey(key, mstSet)
  25.             mstSet[u] = True
  26.              for v in range(self.V):
  27.                 if (
  28.                     self.graph[u][v] > 0
  29.                     and mstSet[v] == False
  30.                     and key[v] > self.graph[u][v]
  31.                 ):
  32.                     key[v] = self.graph[u][v]
  33.                     parent[v] = u
  34.          self.printMST(parent)

复制代码
graph = [
    [0, 2, 0, 6, 0],
    [2, 0, 3, 8, 5],
    [0, 3, 0, 0, 7],
    [6, 8, 0, 0, 9],
    [0, 5, 7, 9, 0],
]
mst = MST(5)
mst.graph = graph
mst.primMST()




这些示例展示了使用不同编程语言实现最小生成树算法。每个示例都使用了类似的思路,通过选择最小权重的边来构建最小生成树。您可以根据需要修改算法和输入图形。请注意,这只是最小生成树算法的简单示例,实际应用中可能会有更复杂的问题和算法。


扫码关注微信公众号,免费查看完整算法内容。







相关帖子

扫码关注微信公众号,及时获取最新资源信息!下载附件优惠VIP会员5折;永久VIP免费
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

免责声明:
1、本站提供的所有资源仅供参考学习使用,版权归原著所有,禁止下载本站资源参与商业和非法行为,请在24小时之内自行删除!
2、本站所有内容均由互联网收集整理、网友上传,并且以计算机技术研究交流为目的,仅供大家参考、学习,请勿任何商业目的与商业用途。
3、若您需要商业运营或用于其他商业活动,请您购买正版授权并合法使用。
4、论坛的所有内容都不保证其准确性,完整性,有效性,由于源码具有复制性,一经售出,概不退换。阅读本站内容因误导等因素而造成的损失本站不承担连带责任。
5、用户使用本网站必须遵守适用的法律法规,对于用户违法使用本站非法运营而引起的一切责任,由用户自行承担
6、本站所有资源来自互联网转载,版权归原著所有,用户访问和使用本站的条件是必须接受本站“免责声明”,如果不遵守,请勿访问或使用本网站
7、本站使用者因为违反本声明的规定而触犯中华人民共和国法律的,一切后果自己负责,本站不承担任何责任。
8、凡以任何方式登陆本网站或直接、间接使用本网站资料者,视为自愿接受本网站声明的约束。
9、本站以《2013 中华人民共和国计算机软件保护条例》第二章 “软件著作权” 第十七条为原则:为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。若有学员需要商用本站资源,请务必联系版权方购买正版授权!
10、本网站如无意中侵犯了某个企业或个人的知识产权,请来信【站长信箱312337667@qq.com】告之,本站将立即删除。
郑重声明:
本站所有资源仅供用户本地电脑学习源代码的内含设计思想和原理,禁止任何其他用途!
本站所有资源、教程来自互联网转载,仅供学习交流,不得商业运营资源,不确保资源完整性,图片和资源仅供参考,不提供任何技术服务。
本站资源仅供本地编辑研究学习参考,禁止未经资源商正版授权参与任何商业行为,违法行为!如需商业请购买各资源商正版授权
本站仅收集资源,提供用户自学研究使用,本站不存在私自接受协助用户架设游戏或资源,非法运营资源行为。
快速回复 返回顶部 返回列表