Prim算法

一,prim算法邏輯

1.理解:克魯斯卡爾算法關注的是邊,普里姆算法關注的是點

把圖中每個頂點比作孤島,點亮一座孤島就可以解鎖附近的孤島

每次解鎖的點都是離自身最近的點

?2.普里姆算法流程

a.采用鄰接矩陣表示,考慮要查找最小值,初始化不存在的邊的值為INF

b.準備工作

cost邊的權值數組,保存到該條邊的權值

mark標記已訪問的點

visit從哪個頂點訪問過來的

c.執行操作

任意找到一個激活點,更新三個數組

從cost數組找到權值最小的頂點,激活該頂點

在邊集數組中保存visit和當前節點的編號,以及權值

重復c操作

二,代碼實現

1.頭文件中的接口

//
// Created by 27893 on 2025/8/1.
//#ifndef PRIM_H
#define PRIM_H
#include "common.h"
#include "../MatrixGraph/MatrixGraph.h"int primMGraph(MGraph*graph,int startV,EdgeSet*result);
#endif //PRIM_H
//
// Created by 27893 on 2025/8/1.
//#ifndef COMON_H
#define COMON_H
typedef struct {int begin;int end;int weight;
}EdgeSet;
#endif //COMON_H

2.將頭文件中的接口一一實現

//
// Created by 27893 on 2025/8/1.
//#include <stdio.h>
#include <stdlib.h>
#include "Prim.h"int primMGraph(MGraph *graph, int startV, EdgeSet *result) {int*cost=malloc(sizeof(int)*graph->nodeNum);int*mark=malloc(sizeof(int)*graph->nodeNum);int*visit=malloc(sizeof(int)*graph->nodeNum);if (cost==NULL||mark==NULL||visit==NULL) {return 0;}int sum=0;//初始化激活startvfor (int i=0;i<graph->nodeNum;i++) {cost[i]=graph->edges[startV][i];mark[i]=0;if (graph->edges[startV][i]<INF) {visit[i]=startV;}else {visit[i]=i;}}mark[startV]=1;for (int i=0;i<graph->nodeNum-1;i++) {//1.在cost找到最小值int k=0,mini=INF;for (int j=0;j<graph->nodeNum;j++) {if (mark[j]==0&&cost[j]<mini) {mini=cost[j];k=j;}}//2.更新邊集數組result[i].begin=visit[k];result[i].end=k;result[i].weight=mini;mark[k]=1;sum+=mini;//3.更新cost數組for (int j=0;j<graph->nodeNum;j++) {if (mark[j]==0&&graph->edges[k][j]<cost[j]) {cost[j]=graph->edges[k][j];visit[j]=k;}}}free(cost);free(mark);free(visit);return sum;
}

3,測試是否有bug

//
// Created by 27893 on 2025/7/31.
//
#include <stdio.h>
#include <stdlib.h>#include "Kruskal.h"
#include "Prim.h"void setupMGraph01(MGraph *graph, int edgeValue) {const char *names[] = {"A", "B", "C", "D", "E", "F", "G"};initMGraph(graph, names, 7, 0, edgeValue);addMGraph(graph, 0, 1, 12);addMGraph(graph, 0, 5, 16);addMGraph(graph, 0, 6, 14);addMGraph(graph, 1, 2, 10);addMGraph(graph, 1, 5, 7);addMGraph(graph, 2, 3, 3);addMGraph(graph, 2, 4, 5);addMGraph(graph, 2, 5, 6);addMGraph(graph, 3, 4, 4);addMGraph(graph, 4, 5, 2);addMGraph(graph, 4, 6, 8);addMGraph(graph, 5, 6, 9);
}
void test01() {MGraph graph;EdgeSet*edges;int num;EdgeSet*result;int sumweight;setupMGraph01(&graph,0);edges=malloc(sizeof(EdgeSet)*graph.edgeNum);num=initEdgeSet(&graph,edges);printf("edges num:%d\n",num);sortEdgeSet(edges,num);result=malloc(sizeof(EdgeSet)*graph.nodeNum-1);sumweight=kruskalMGraph(&graph,edges,num,result);printf("sumweight:%d\n",sumweight);for (int i=0;i<graph.nodeNum-1;i++) {printf("edges[%d]:%s----%d----%s\n",i+1,graph.vex[result[i].begin].show,result[i].weight,graph.vex[result[i].end].show);}
}
void test02() {MGraph graph;setupMGraph01(&graph,INF);EdgeSet*result;result=malloc(sizeof(EdgeSet)*(graph.nodeNum-1));int sum=primMGraph(&graph,0,result);printf("sumWeight:%d\n",sum);for (int i=0;i<graph.nodeNum-1;i++) {printf("edges[%d]:%s----%d----%s\n",i+1,graph.vex[result[i].begin].show,result[i].weight,graph.vex[result[i].end].show);}
}
int main() {test01();test02();return 0;
}

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

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

相關文章

嵌入式學習之硬件——51單片機 1.0

一、基礎知識1.什么是嵌入式&#xff1f;嵌入式以應用為中心&#xff0c;計算機技術為基礎&#xff0c;軟硬件可裁剪的專用計算機系統&#xff1b;2.嵌入式的應用&#xff1f;消費電子、無人駕駛、儲能、新能源........3.嵌入式發展&#xff1f;&#xff08;1&#xff09;第一階…

51c大模型~合集161

自己的原文哦~ https://blog.51cto.com/whaosoft/14079111 #這家國內公司&#xff0c;在給xx智能技術棧做「通解」 打通機器人智能化的關鍵&#xff1a;眼腦手。 xx智能&#xff08;Embodied Intelligence&#xff09;是 AI 領域里熱度極高的賽道&#xff1a;給大模型…

Linux9 root密碼修改

開機按e進入在linux行即quiet后面輸入rd.break ctrlx進入內核輸入mount -o remount,rw /sysrootchroot /sysrootpasswd root即可修改密碼輸入touch /.autorelabelexitexit等待即可

提示詞增強工程(Prompt Enhancement Engineering)白皮書草稿

提示詞增強工程&#xff08;Prompt Enhancement Engineering&#xff09;白皮書草稿 作者&#xff1a; 技術人進化社 Email&#xff1a;2819699195qq.com 日期&#xff1a; 2025年7月30日 1. 引言 隨著大型語言模型&#xff08;LLM&#xff09;能力的飛速發展&#xff0c;如何高…

電路元器件

電流單位 電壓 電阻單位 電阻的決定式 歐姆定律 交流電和直流電 交流電 串聯電路 并聯電路 在線模擬器 Circuitjs web 在線電路模擬器 下載

廣泛分布于內側內嗅皮層全層的速度細胞(speed cells)對NLP中的深層語義分析的積極影響和啟示

速度細胞&#xff08;Speed Cells&#xff09;作為內側內嗅皮層&#xff08;MEC&#xff09;的核心神經元&#xff0c;通過編碼運動速度信息與網格細胞協同實現動態路徑整合。這一神經機制為自然語言處理&#xff08;NLP&#xff09;的深層語義分析提供了以下關鍵啟示和影響&am…

sql中的多表查詢

在SQL中&#xff0c;多表查詢用于從多個表中組合數據&#xff0c;常見的方法包括 ?連接查詢&#xff08;JOIN&#xff09;?? 和 ?子查詢。以下是詳細說明和示例&#xff1a;一、連接查詢&#xff08;JOIN&#xff09;通過關聯字段將多個表的數據合并&#xff0c;分為以下幾…

Ruby 面向對象編程深入解析

Ruby 面向對象編程深入解析 引言 Ruby 作為一種動態、解釋型、面向對象的語言,自1995年由日本程序員Yukihiro Matsumoto創造以來,憑借其簡潔、靈活和強大的面向對象特性,在全球范圍內獲得了廣泛的認可。本文將深入探討Ruby的面向對象編程(OOP)特性,幫助讀者更好地理解和…

Baumer工業相機堡盟工業相機如何通過YoloV8深度學習模型實現圍欄羊駝的檢測識別(C#代碼,UI界面版)

Baumer工業相機堡盟工業相機如何通過YoloV8深度學習模型實現圍欄羊駝的檢測識別&#xff08;C#代碼&#xff0c;UI界面版&#xff09;工業相機使用YoloV8模型實現圍欄羊駝的檢測識別工業相機通過YoloV8模型實現圍欄羊駝的檢測識別的技術背景在相機SDK中獲取圖像轉換圖像的代碼分…

如何利用 rowid 在OceanBase 中處理大表時提效

本文作者&#xff1a;張瑞遠&#xff0c;現主要從事電信級IT系統及數據庫的規劃設計、架構設計、運維實施、運維服務、故障處理、性能優化等工作&#xff0c;曾經從事銀行、證券數倉設計、開發、優化類工作&#xff0c;持有Orale OCM,MySQL OCP及國產代表數據庫認證。 獲得包括…

【從0開始學習Java | 第4篇】類和對象

文章目錄&#x1f44f;類和對象的概念什么是類&#xff1f;什么是對象&#xff1f;&#x1f95d;構造方法如何創建一個對象&#xff1f;&#x1f95d;對象內存布局完整應用 - 編寫一個類&#xff1a;人&#xff0c;其具備年齡、性別、姓名等基礎屬性&#xff0c;并實例化一個人…

Synopsys:默認報告精度(report_default_significant_digits變量)

相關閱讀 Synopsyshttps://blog.csdn.net/weixin_45791458/category_12812219.html?spm1001.2014.3001.5482 在使用report_timing之類的報告命令時&#xff0c;可以使用-significant_digits選項指定報告的精度&#xff0c;在不使用該選項的情況下&#xff0c;命令使用由repor…

2025年藍橋杯青少圖形化編程國考真題——擺放玩具

編程實現擺放玩具。&#xff08;角色非源素材&#xff09;擺放規則&#xff1a;在方格中擺放玩具&#xff0c;每個方格只能擺放一個&#xff0c;并且如果某個方格中已經擺放了玩具&#xff0c;那么與之上、下、左、右相鄰的四個方格中無法再擺放同種玩具。具體要求1&#xff09…

Android 應用的安裝流程

安裝流程總覽&#xff1a; 用戶觸發安裝->系統驗證APK的合法性->解析APK元數據->檢查權限和存儲空間->復制APK到目標位置->生成應用私有數據->注冊組件到系統->安裝完成 關鍵步驟&#xff1a; 1.用戶觸發安裝&#xff1a;a.通過應用商店b.通過adb命令c.通…

基于 Amazon Bedrock 與 Anthropic Claude 3 智能文檔處理方案:從掃描件提取到數據入庫全流程實踐

基于 Amazon Bedrock 與 Anthropic Claude 3 智能文檔處理方案&#xff1a;從掃描件提取到數據入庫全流程實踐 文章目錄基于 Amazon Bedrock 與 Anthropic Claude 3 智能文檔處理方案&#xff1a;從掃描件提取到數據入庫全流程實踐方案架構前提準備&#xff1a;亞馬遜云科技注冊…

深入淺出設計模式——創建型模式之單例模式 Singleton

文章目錄“天上天下&#xff0c;唯我獨尊”——單例模式單例模式簡介單例模式結構餓漢式懶漢式客戶端示例運行結果單例模式總結構建型模式 Creational Patterns 小結 Summary代碼倉庫“天上天下&#xff0c;唯我獨尊”——單例模式 你能在電腦上調出兩個Windows任務管理器嗎&a…

靜電釋放檢測漏報率↓85%!陌訊多模態融合算法在電子廠ESD防護實戰解析

?摘要?? 基于邊緣計算的靜電釋放(ESD)視覺檢測方案&#xff0c;通過多模態融合技術顯著提升復雜場景魯棒性。實測顯示&#xff1a;在電子元件裝配線上&#xff0c;ESD事件檢測mAP0.5達89.1%&#xff0c;較基線模型提升28.3%。一、行業痛點&#xff1a;ESD檢測的隱形危機根據…

RAL-2025 | “藏寶圖”驅動的具身導航!HAM-Nav:基于手繪地圖引導的機器人導航

作者&#xff1a;Aaron Hao Tan, Angus Fung, Haitong Wang, Goldie Nejat單位&#xff1a;多倫多大學機械與工業工程系論文標題&#xff1a;Mobile Robot Navigation Using Hand-Drawn Maps: A Vision Language Model Approach出版信息&#xff1a;IEEE ROBOTICS ANDAUTOMATI…

Vue.js 與后端技術結合開發指南

Vue.js 作為現代化的前端框架&#xff0c;可以與多種后端技術完美結合&#xff0c;構建全棧應用。下面我將詳細介紹 Vue 可以與哪些后端技術結合開發&#xff0c;并提供可視化示例。Vue 可結合的后端技術概覽主流組合方案對比后端技術適合場景優點缺點學習曲線Node.js全棧JavaS…

邏輯回歸在銀行貸款審批中的應用:參數選擇與實踐

目錄 一、數據背景與預處理 1.數據前五行 2.數據預處理步驟 二、邏輯回歸的正則化參數選擇 1.交叉驗證選擇最優C 2.為什么選擇召回率作為評估指標&#xff1f; 三、參數選擇的核心結論 四、后續優化方向 在銀行貸款審批場景中&#xff0c;準確判斷貸款人是否符合貸款條…