Kruskal算法求最小生成樹

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#define MAX 100
#define NO INT_MAX//NO表示沒有邊,相當于INFtypedef struct Graph
{int arcnum;int vexnum;char vextex[MAX][20];int martrix[MAX][MAX];
}Graph;
//鄰接矩陣打印輸出圖
void print_graph(Graph* g)
{for (int i = 0; i < g->vexnum; i++){printf("\t%s", g->vextex[i]);}printf("\n");for (int i = 0; i < g->vexnum; i++){printf("%s\t", g->vextex[i]);for (int j = 0; j < g->vexnum; j++){if (g->martrix[i][j] == INT_MAX){printf("∞\t");}else{printf("%d\t", g->martrix[i][j]);}}printf("\n");}
}
//定義最小生成樹的邊結構
typedef struct Arc
{int begin;int end;int weight;//在邊結構中加多了一個權值weight來用于判斷構造最小生成樹
}Arc;
//打印最小生成樹
void print_tree(Graph* g, Arc* arc, int count)
{printf("最小生成樹:\n");for (int i = 0; i < count; i++){printf("%s--->%s\n", g->vextex[arc[i].begin], g->vextex[arc[i].end]);}
}
//比較函數(用于在qsort中,因為qsort是一個泛函數,開始時未知函數類型,需要在調用函數時再給出),
//所以這個比較基準函數需要使用強制類型轉換
int compare_arc(const void* a, const void* b)
{return(((Arc*)a)->weight-((Arc*)b)->weight);//強制轉化為arc類型,根據邊結構的weight值進行比較,如果大于則返回正數,等于則返回0,小于則返回負數
}
//克魯斯卡爾算法
void graph_kruskal(Graph* g)
{//定義邊結構數組arc用于保存圖中存在的邊Arc* arc = (Arc*)malloc(sizeof(Arc) * g->vexnum * g->vexnum);assert(arc);int count=0;//count用于存邊for (int i = 0; i < g->vexnum; i++){for (int j = 0; j < g->vexnum; j++){if (g->martrix[i][j] != NO){(arc + count)->begin = i;(arc + count)->end = j;(arc + count)->weight = g->martrix[i][j];count++;}}}//快速排序根據邊權值進行排序//(注意快速排序是不穩定的,所以選邊的順序不是按照原順序的)qsort(arc,count,sizeof(Arc),compare_arc);//定義parent整型數組,大小為頂點數int* parent = (int*)malloc(sizeof(int) * g->vexnum);assert(parent);for (int i = 0; i < g->vexnum; i++){parent[i] = i;//初始化時先將每個結點的前驅結點都置為自身}Arc* result = (Arc*)malloc(sizeof(Arc) * g->arcnum);//result是用于存儲對邊進行排序后的邊結構 assert(result);count = 0;//count用于跟蹤已選的邊的數量int i = 0;//i用于遍歷所有的邊printf("Kruskal的選邊過程如下:\n");while (count < g->vexnum - 1)//當邊沒選夠時則繼續進行{int x = (arc + i)->begin;int y = (arc + i)->end;//初始化兩個變量來存x和y的根節點int root_x = x;int root_y = y;while (parent[root_x] != root_x){root_x = parent[root_x];//進行壓縮路徑,將其根節點設為根節點的根節點}while (parent[root_y] != root_y){root_y = parent[root_y];}if (root_x != root_y)//如果不構成一個環的話{result[count] = arc[i]; //將該邊加入到最小生成樹中count++;printf("選擇邊:%s---%s,權值為:%d\n",g->vextex[x],g->vextex[y],g->martrix[x][y]);parent[root_x] = root_y;//將所選邊前面點的前驅節點置為后邊的點(也是起到類似壓縮路徑的效果,誰先誰后好像關系不大)}i++;}print_tree(g, arc, count);free(arc);free(result);free(parent);
}int main()
{Graph g = { 10,7,{"A","B","C","D","E","F","G"},{{NO,50,60,NO,NO,NO,NO},{50,NO,NO,65,40,NO,NO},{60,NO,NO,52,NO,NO,45},{NO,65,52,NO,50,30,42},{NO,40,NO,50,NO,70,NO},{NO,NO,NO,30,70,NO,NO},{NO,NO,45,42,NO,NO,NO}} };print_graph(&g);graph_kruskal(&g);return 0;
}

在這里插入圖片描述
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/23333.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/23333.shtml
英文地址,請注明出處:http://en.pswp.cn/web/23333.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

什么無線領夾麥克風音質最好?領夾麥克風品牌排行榜前十名推薦

?在當今的數字化浪潮中&#xff0c;個人聲音的傳播和記錄變得尤為重要。無論是會議中心、教室講臺還是戶外探險&#xff0c;無線領夾麥克風以其卓越的便攜性和連接穩定性&#xff0c;成為了人們溝通和表達的首選工具。面對市場上琳瑯滿目的無線麥克風選擇&#xff0c;為了幫助…

【Python】使用 SQLObject orm 庫快速將接口數據存入數據庫

使用 SQLObject orm 庫快速將接口數據存入數據庫 文章目錄 使用 SQLObject orm 庫快速將接口數據存入數據庫背景orm python 版本都有哪些&#xff1f; SQLObject 簡單的使用 背景 因為測試需要&#xff0c;要將百萬條數據接口查詢數據存入數據庫中&#xff0c;為了減少 mysql …

Doris insert into 插入語句執行成功,且select查詢成功,返回結果不報錯,但查不到該插入數據

問題&#xff1a;Doris insert into 正常執行成功&#xff0c;select 查詢也執行成功&#xff0c;但查不到該寫入數據 原因&#xff1a;由于有其他 insert commit 事務待提交且該任務處于鎖的狀態&#xff0c;導致不斷在回滾&#xff0c;進而造成其他的insert into 語句也執行成…

26 - 超過5名學生的課(高頻 SQL 50 題基礎版)

26 - 超過5名學生的課 select class fromCourses group byclass havingcount(*)>5;

Seed-TTS語音編輯有多強?對比實測結果讓你驚嘆!

GLM-4-9B 開源系列模型 前言 就在最近&#xff0c;ByteDance的研究人員最近推出了一系列名為Seed-TTS的大規模自回歸文本轉語音(TTS)模型,能夠合成幾乎與人類語音無法區分的高質量語音。那么Seed-TTS的表現究竟有多強呢?讓我們一起來感受下Seed-TTS帶來的驚喜吧! 介紹Seed-TTS…

Java并發包中的鎖升級

在Java中&#xff0c;特別是ReentrantLock和synchronized關鍵字的實現中&#xff0c;鎖的升級通常涉及到從無鎖狀態到偏向鎖、再升級到輕量級鎖&#xff0c;最后可能升級到重量級鎖的過程。這一系列過程是為了減少鎖帶來的開銷&#xff0c;提高并發效率。 偏向鎖&#xff08;Bi…

如何用手寫代碼實現JavaScript中的reduce函數?

在JavaScript中&#xff0c;Array.prototype.reduce() 是一個內置方法&#xff0c;它遍歷數組中的每個元素&#xff0c;并將它們累積成一個單一的返回值。我們可以自己編寫一個類似的函數來模擬這個過程。 下面是一個簡單的手寫實現例子&#xff1a; function myReduce(arr, …

組裝服務器重裝linux系統【idrac集成戴爾遠程控制卡】

&#x1f341;博主簡介&#xff1a; &#x1f3c5;云計算領域優質創作者 &#x1f3c5;2022年CSDN新星計劃python賽道第一名 &#x1f3c5;2022年CSDN原力計劃優質作者 &#x1f3c5;阿里云ACE認證高級工程師 &#x1f3c5;阿里云開發者社區專…

Vue 跨平臺性能優化十法

Vue.js 開發能夠同時運行在不同平臺&#xff08;如 Web、移動平臺和桌面平臺&#xff09;的應用程序。以下是一些常見的跨平臺解決方案&#xff1a; 1. 使用 Vue.js 官方發布的框架&#xff1a; Vue.js&#xff1a;主要用于 Web 開發。 Vue Native&#xff1a;使用 Vue 語法開…

數據結構 | 超詳細講解七大排序(C語言實現,含動圖,多方法!)

目錄 ?編輯 排序的概念 常見排序算法 ?編輯 1.冒泡排序 &#x1f379;圖解 &#x1f973;代碼實現 &#x1f914;時間復雜度 2.插入排序 &#x1f379;圖解 &#x1f334;深度剖析 &#x1f34e;代碼思路 &#x1f973;代碼實現 &#x1f914;時間復雜度 3.希爾…

2024 年適用于 Linux 的 5 個微軟 Word 替代品

對于那些最近由于隱私問題或其他原因而轉向 Linux 的用戶來說&#xff0c;可能很難替換他們最喜歡的、不在 Linux 操作系統上運行的應用程序。 尋找流行程序的合適替代品可能會成為一項挑戰&#xff0c;而且并不是每個人都準備好花費大量時間來嘗試弄清楚什么可以與他們在 Win…

讀書筆記|《把自己變成稀缺資產》:我們都擁有100分的欲望,卻只有1分的耐心。

哈嘍&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 最近在讀一本書《把自己變成稀缺資產》&#xff0c;其中一章講到耐心的重要性&#xff0c;很有共鳴。 當今社會&#xff0c;生活節奏越來越快&#xff0c;我們都在急于求成的追求結果&#xff0c;對過程越來越缺乏耐…

C++核心編程友元的應用

文章目錄 1.友元1.什么是友元2.全局函數做友元2.類做友元3.成員函數做友元 1.友元 1.什么是友元 在C中&#xff0c;友元&#xff08;friend&#xff09;是一種允許一個類或函數訪問另一個類的非公有&#xff08;private 或 protected&#xff09;成員的機制。這種機制打破了類…

系統研發安全漏洞

軟件安全漏洞指的是軟件中存在的具體缺陷或疏忽&#xff0c;這些缺陷或疏忽能夠被攻擊者利用并執行一些惡意行為。這些行為包括但不限于泄露或修改敏感信息、干擾或銷毀系統、接管計算機系統或程序權限等。與大眾熟悉的軟件缺陷&#xff08;Bug&#xff09;相比&#xff0c;安全…

Mysql中表的常用約束

在MySQL表中常用的約束有以下幾種&#xff1a; 1. 主鍵約束&#xff08;Primary Key Constraint&#xff09;&#xff1a;用于標識表中的唯一記錄。一個表只能有一個主鍵&#xff0c;主鍵列不能有重復值&#xff0c;也不能為NULL。 2. 唯一約束&#xff08;Unique Constraint…

2024050402-重學 Java 設計模式《實戰責任鏈模式》

重學 Java 設計模式&#xff1a;實戰責任鏈模式「模擬618電商大促期間&#xff0c;項目上線流程多級負責人審批場景」 一、前言 場地和場景的重要性 射擊&#x1f3f9;需要去靶場學習、滑雪&#x1f3c2;需要去雪場體驗、開車&#x1f697;需要能上路實踐&#xff0c;而編程…

Scanpy(4)用與數據整合和批次處理

Scanpy包,用與數據整合和批次處理,包含批次效應的BBKNN算法和用于對比的ingest基礎算法比較,及其原理簡介。 1. 依賴: (1)數據集(全部需要掛VPN): PBMC:pbmc3k_processed()(需要下載);pbmc68k_reduced()(scanpy自帶)Pancreas(需要下載)(2)Python包:Scanp…

【Python】把xmind轉換為指定格式txt文本

人工智能訓練通常需要使用文本格式&#xff0c;xmind作為一種常規格式不好進行解析&#xff0c;那如何把xmind轉換為txt格式呢&#xff1f; 軟件信息 python python -v Python 3.9.13 (tags/v3.9.13:6de2ca5, May 17 2022, 16:36:42) [MSC v.1929 64 bit (AMD64)] on win32…

Python 包安裝及常用命令【python 入門】

背景&#xff1a; 近期看到一個項目&#xff0c;做微信只能機器人&#xff0c;服務是使用python搭建的&#xff0c;于是拷貝下來自己打算跑一跑&#xff0c;部署一下&#xff0c;可是自己又沒有python的經驗&#xff0c;于是各種查資料學習&#xff0c;跟著敲一敲&#xff0c;順…

Go 1.19.4 切片與子切片-Day 05

1. 切片 1.1 介紹 切片在Go中是一個引用類型&#xff0c;它包含三個組成部分&#xff1a;指向底層數組的指針&#xff08;pointer&#xff09;、切片的長度&#xff08;length&#xff09;以及切片的容量&#xff08;capacity&#xff09;&#xff0c;這些信息共同構成了切片的…