【PTA數據結構 | C語言版】求最小生成樹的Prim算法

本專欄持續輸出數據結構題目集,歡迎訂閱。

文章目錄

    • 題目
    • 代碼

題目

請編寫程序,實現在帶權的無向圖中求最小生成樹的 Prim 算法。
注意:當多個待收錄頂點到當前點集的距離等長時,按編號升序進行收錄。

輸入格式:
輸入首先在第一行給出兩個正整數,依次為當前要創建的圖的頂點數 n(≤100)和邊數 m。
隨后 m 行,每行給出一條無向邊兩端點的編號、權重。頂點編號從 0 開始,權重(≤100)為整數。同行數字均以一個空格分隔。

輸出格式:
參考樣例。
首先在一行中輸出 total weight = x,其中 x 為最小生成樹中所有邊的總權重。如果最小生成樹不存在,則 x 為 ?1。
隨后在一行中按頂點編號升序輸出每個頂點在最小生成樹中的父結點的編號。為輸出簡單起見,每個數字后有一個空格。
注意:此處默認頂點 0 為最小生成樹的根結點,其父結點編號規定為 ?1。算法初始化時,所有頂點(除了根結點)的父結點編號默認為 0。

輸入樣例 1:
6 9
0 1 1
0 2 3
1 2 6
1 3 2
2 3 7
2 4 5
2 5 4
3 5 8
4 5 1

輸出樣例 1:
total weight = 11
-1 0 0 1 5 2

輸入樣例 2:
7 9
0 1 1
0 2 3
1 2 6
1 3 2
2 3 7
2 4 5
2 5 4
3 5 8
4 5 1

輸出樣例 2:
total weight = -1
-1 0 0 1 5 2 0

代碼

#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define MAX_VERTICES 100
#define INF 999999999int main() {int n, m;int graph[MAX_VERTICES][MAX_VERTICES];int dist[MAX_VERTICES];int parent[MAX_VERTICES];int visited[MAX_VERTICES];// 初始化圖for (int i = 0; i < MAX_VERTICES; i++) {for (int j = 0; j < MAX_VERTICES; j++) {graph[i][j] = INF;}}// 讀取頂點數和邊數scanf("%d %d", &n, &m);// 讀取每條邊的信息for (int i = 0; i < m; i++) {int u, v, weight;scanf("%d %d %d", &u, &v, &weight);graph[u][v] = weight;graph[v][u] = weight;}// 初始化距離數組和父結點數組for (int i = 0; i < n; i++) {dist[i] = INF;parent[i] = 0;  // 默認父結點為0visited[i] = 0;}// 從頂點0開始dist[0] = 0;parent[0] = -1;  // 根結點的父結點為-1// Prim算法核心for (int i = 0; i < n; i++) {// 選擇距離最小且未被訪問的頂點int min_dist = INF;int u = -1;for (int j = 0; j < n; j++) {if (!visited[j] && dist[j] < min_dist) {min_dist = dist[j];u = j;} else if (!visited[j] && dist[j] == min_dist && j < u) {// 當距離相同時,選擇編號較小的頂點u = j;}}// 如果找不到符合條件的頂點,說明圖不連通if (u == -1) {break;}visited[u] = 1;// 更新與u相鄰的頂點的距離for (int v = 0; v < n; v++) {if (!visited[v] && graph[u][v] != INF && graph[u][v] < dist[v]) {dist[v] = graph[u][v];parent[v] = u;}}}// 計算總權重并檢查是否存在最小生成樹int total_weight = 0;int all_visited = 1;for (int i = 0; i < n; i++) {if (!visited[i]) {all_visited = 0;break;}if (i != 0) {  // 根結點的邊不計入總權重total_weight += dist[i];}}// 輸出結果if (all_visited) {printf("total weight = %d\n", total_weight);} else {printf("total weight = -1\n");}// 輸出每個頂點的父結點for (int i = 0; i < n; i++) {printf("%d ", parent[i]);}printf("\n");return 0;
}

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

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

相關文章

【加解密與C】Rot系列(四)RotSpecial

RotSpecial 函數解析RotSpecial 是一個自定義函數&#xff0c;通常用于處理特定的旋轉操作&#xff0c;尤其在圖形變換或數據處理中。該函數可能涉及歐拉角、四元數或其他旋轉表示方法&#xff0c;具體行為取決于實現上下文。以下是關于該函數的通用解釋和可能的使用方法&#…

【機器學習深度學習】LLaMAFactory中的精度訓練選擇——bf16、fp16、fp32與pure_bf16深度解析

目錄 前言 一、 為什么精度如此重要&#xff1f;—— 內存、速度與穩定性的三角博弈 二、 四大精度/模式詳解&#xff1a; bf16, fp16, fp32, pure_bf16 三、 關鍵特性對比表 ▲四大計算類型核心對比表 ▲ 顯存占用對比示例&#xff08;175B參數模型&#xff09; ▲LLa…

C# 基于halcon的視覺工作流-章21-點查找

C# 基于halcon的視覺工作流-章21-點查找 本章目標&#xff1a; 一、檢測顯著點&#xff1b; 二、Harris檢測興趣點&#xff1b; 三、Harris二項式檢測興趣點&#xff1b; 四、Sojka運算符檢測角點&#xff1b; 五、Lepetit算子檢測興趣點&#xff1b;一、檢測顯著點 halcon算子…

(11)機器學習小白入門YOLOv:YOLOv8-cls epochs與數據量的關系

YOLOv8-cls epochs與數據量的關系 (1)機器學習小白入門YOLOv &#xff1a;從概念到實踐 (2)機器學習小白入門 YOLOv&#xff1a;從模塊優化到工程部署 (3)機器學習小白入門 YOLOv&#xff1a; 解鎖圖片分類新技能 (4)機器學習小白入門YOLOv &#xff1a;圖片標注實操手冊 (5)機…

Grafana | 如何將 11.x 升級快速到最新 12.x 版本?

[ 知識是人生的燈塔&#xff0c;只有不斷學習&#xff0c;才能照亮前行的道路 ]&#x1f4e2; 大家好&#xff0c;我是 WeiyiGeek&#xff0c;一名深耕安全運維開發&#xff08;SecOpsDev&#xff09;領域的技術從業者&#xff0c;致力于探索DevOps與安全的融合&#xff08;Dev…

Dubbo + Spring Boot + Zookeeper 快速搭建分布式服務

Dubbo Spring Boot Zookeeper 快速搭建分布式服務 本文將詳細介紹如何基于 Dubbo、Spring Boot 和 Zookeeper 快速搭建一個簡單的分布式服務調用場景&#xff0c;包含服務提供者&#xff08;Provider&#xff09;、服務消費者&#xff08;Consumer&#xff09;及公共接口&…

五分鐘掌握 TDengine 數據文件的工作原理

小 T 導讀&#xff1a;今天我們來探討一下——TDengine中的時序數據到底是如何存儲的&#xff1f; 在上一期的文章《五分鐘掌握 TDengine 時序數據的保留策略》中&#xff0c;我們知道了TDengine是如何按照時間段對數據進行分區來管理數據的。 接下來&#xff0c;我們和大家一起…

Python爬蟲實戰:研究http-parser庫相關技術

一、研究背景與意義 在當今數字化時代,網絡數據蘊含著巨大的價值。從商業決策、學術研究到社會治理,對海量網絡信息的有效采集與分析至關重要。網絡爬蟲作為數據獲取的核心工具,其性能與穩定性直接影響數據質量。然而,隨著互聯網技術的發展,網站反爬機制不斷升級,傳統爬…

Go語言實戰案例-批量重命名文件

在《Go語言100個實戰案例》中的 文件與IO操作篇 - 案例17&#xff1a;批量重命名文件 的完整內容&#xff0c;適合初學者實踐如何使用 Go 操作文件系統并批量處理文件名。&#x1f3af; 案例目標實現一個小工具&#xff0c;能夠批量重命名指定目錄下的所有文件&#xff0c;例如…

基于單片機非接觸紅外測溫系統

傳送門 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品題目速選一覽表 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品題目功能速覽 概述 本設計實現了一種基于單片機的非接觸式紅外測溫系統&#xff0c;適用于快速、安全測量物體表面溫…

Python 入門手札:從 0 到會--第十天Python常用的第三方庫Numpy,Pandas,Matplotlib

目錄 一、Numpy 1.NumPy 是什么&#xff1f; 1.1安裝numpy 1.2 導入numpy模塊 2.NumPy 的核心&#xff1a;ndarray 2.1 什么是 ndarray&#xff1f; 2.2 ndarray 的創建方式 2.3 常見屬性&#xff08;用于查看數組結構&#xff09; 2.4 ndarray 的切片與索引 2.5 ndarr…

mysql 性能優化之Explain講解

EXPLAIN是 MySQL 中用于分析查詢執行計劃的重要工具&#xff0c;通過它可以查看查詢如何使用索引、掃描數據的方式以及表連接順序等信息&#xff0c;從而找出性能瓶頸。以下是關于EXPLAIN的詳細介紹和實戰指南&#xff1a;1. EXPLAIN 基本用法在SELECT、INSERT、UPDATE、DELETE…

Redis 連接:深度解析與最佳實踐

Redis 連接:深度解析與最佳實踐 引言 Redis 作為一款高性能的內存數據結構存儲系統,在當今的互聯網應用中扮演著越來越重要的角色。高效的 Redis 連接管理對于保證系統的穩定性和性能至關重要。本文將深入探討 Redis 連接的原理、配置以及最佳實踐,幫助讀者更好地理解和應…

C語言---VSCODE的C語言環境搭建

文章目錄資源下載配置環境驗證資源下載 站內下載 配置環境 解壓壓縮包&#xff0c;復制以下文件的路徑 打開主頁搜索系統環境變量 點擊環境變量 選擇系統變量中的Path&#xff0c;點擊編輯 在最后面添加路徑。 添加完成記得關機重啟。 驗證 重啟電腦之后打開在Power…

ojdbc對應jdk版本附下載地址(截止20250722)

可以從Oracle官網查看&#xff0c; JDBC and UCP Downloads page

Redis為什么被設計成是單線程的?

Redis單線程模型解析 當我們說Redis是單線程時,特指"其網絡IO和鍵值對讀寫操作由單個線程完成"。實際上,Redis僅網絡請求模塊和數據操作模塊采用單線程設計,而持久化存儲、集群支持等其他模塊都采用了多線程架構。 事實上,Redis從4.0版本就開始對部分命令實現了…

基礎流程圖

一、常用符號及定義二、 畫圖基礎規則1、從上至下&#xff0c;從左至右流向順序。2、開始符號只能有一個出口。3、進程符號不做校驗邏輯。4、相同流程圖&#xff0c;符號大小應為一致。5、引用流程&#xff0c;不重復繪制。6、路徑符號盡量避免交叉重疊。7、同一路徑&#xff0…

C# 結構體

目錄 1.如何定義一個結構體&#xff08;struct 關鍵字&#xff09; 2.如何使用一個結構體 3.如何修改一個數據 4.如何讓去訪問一個學生的信息 5、結構體數組 練習 1.如何定義一個結構體&#xff08;struct 關鍵字&#xff09; C#中public 、private、protect的區別 結構…

在Python中操作Word

生成請假條1.準備一個文件“template.docx”&#xff0c;內容如下。2.安裝docxtpl庫。pip install docxtpl3.執行代碼&#xff0c;替換字典內容。from docxtpl import DocxTemplate# 讀取定義模板文件 tpl DocxTemplate(template.docx) # 創建子文檔 sd tpl.new_subdoc() # 添…

網絡協議(四)網絡層 路由協議

在網絡層及網絡層之上使用IP地址&#xff0c;IP地址放在IP數據報的首部&#xff0c;而MAC地址放在MAC幀的首部。通過數據封裝&#xff0c;把IP數據報分組封裝為MAC幀。 由于路由器的隔離&#xff0c;IP網絡中無法通過廣播MAC地址來完成跨網絡的尋址&#xff0c;因此在網絡層中只…