算法筆記.kruskal算法求最小生成樹

題目:(來源:AcWing)

給定一個?n?個點?m?條邊的無向圖,圖中可能存在重邊和自環,邊權可能為負數。

求最小生成樹的樹邊權重之和,如果最小生成樹不存在則輸出?impossible

給定一張邊帶權的無向圖?G=(V,E),其中?V?表示圖中點的集合,E?表示圖中邊的集合,n=|V|,m=|E|。

由?V?中的全部?n?個頂點和?E?中?n?1?條邊構成的無向連通子圖被稱為?G?的一棵生成樹,其中邊的權值之和最小的生成樹被稱為無向圖?G?的最小生成樹。

輸入格式

第一行包含兩個整數?n?和?m。

接下來?m 行,每行包含三個整數 u,v,w,表示點?u?和點?v?之間存在一條權值為?w?的邊。

輸出格式

共一行,若存在最小生成樹,則輸出一個整數,表示最小生成樹的樹邊權重之和,如果最小生成樹不存在則輸出?impossible

數據范圍

1≤n≤105,
1≤m≤2?105,
圖中涉及邊的邊權的絕對值均不超過?1000。

輸入樣例:
4 5
1 2 1
1 3 2
1 4 3
2 3 2
3 4 4
輸出樣例:
6

kruskal算法思路:

  1. 每次聯通一條最短邊,加n-1次, 如果邊的兩給節點已經聯通,則無需再加。

  2. 查找兩個點是否在同一個聯通集合,需要用到并查集

  3. 如果加入邊的數量<n-1,則說明無法生成最小生成樹。

代碼實現:

#include<iostream>
#include<algorithm>
using namespace std;const int N = 100020,M = 200020;//定義邊
struct Edge{int a,b,w;bool operator<(const Edge& edge){return w<edge.w;}
};int n,m;
int p[N];//并查集的集合
Edge edge[M];//邊的集合int find(int x)//并查集的find函數
{if(p[x]!=x) p[x]=find(p[x]);//遞歸的同時壓縮路徑,提高效率return p[x];//直接返回所在集合編號
}int kruskal()
{int res=0,nums=0;//res記錄最小樹權和,num記錄聯通邊數for(int i = 0;i<m;i++){Edge temp = edge[i];int a=temp.a , b=temp.b , c = temp.w;a = find(a);b = find(b);if(a != b)//a,b不在一個聯通集合中{p[b] = a;//就把他們聯通res+=c;//加入這個最短邊nums++;//聯通邊數+1}}if(nums<n-1) return -1;return res;}int main()
{cin>>n>>m;for(int i = 1;i<=n;i++) p[i] = i;//初始化并查集for(int i = 0;i<m;i++)//初始化邊集{int x,y,z;scanf("%d%d%d",&x,&y,&z);edge[i] = {x,y,z};}//邊集升序排序sort(edge,edge+m);int t = kruskal();if(t==-1) cout <<"impossible"<<endl;else cout<<t<<endl;return 0;
}

參考:

B站@藍不過海呀

地址:?圖-最小生成樹-Prim(普里姆)算法和Kruskal(克魯斯卡爾)算法_嗶哩嗶哩_bilibili

?

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

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

相關文章

C#開發的自定義Panel滾動分頁控件 - 開源研究系列文章

前些時候因為想擁有一個自己的軟件快捷打開軟件&#xff0c;于是參考Windows 11的開始菜單&#xff0c;進行了編寫這個應用軟件&#xff0c;里面有一個功能就是對顯示的Panel里的應用對象的分頁功能&#xff0c;于是就想寫一個對Panel的自定義滾動條控件。 下面開始介紹此控件的…

【基礎篇】prometheus命令行參數詳解

文章目錄 本篇內容講解命令行參數詳解 本篇內容講解 prometheus高頻修改命令行參數詳解 命令行參數詳解 在頁面的/頁面上能看到所有的命令行參數&#xff0c;如圖所示&#xff1a; 使用shell命令查看 # ./prometheus --help usage: prometheus [<flags>]The Promethe…

深入理解CSS3:Flex/Grid布局、動畫與媒體查詢實戰指南

引言 在現代Web開發中&#xff0c;CSS3已經成為構建響應式、美觀且高性能網站的核心技術。它不僅提供了更強大的布局系統&#xff08;Flexbox和Grid&#xff09;&#xff0c;還引入了令人驚艷的動畫效果和精準的媒體查詢能力。本文將深入探討這些關鍵技術&#xff0c;幫助您提…

從線性到非線性:簡單聊聊神經網絡的常見三大激活函數

大家好&#xff0c;我是沛哥兒&#xff0c;我們今天一起來學習下神經網絡的三個常用的激活函數。 引言&#xff1a;什么是激活函數 激活函數是神經網絡中非常重要的組成部分&#xff0c;它引入了非線性因素&#xff0c;使得神經網絡能夠學習和表示復雜的函數關系。 在神經網絡…

2025上海車展 | 移遠通信重磅發布AR腳踢毫米波雷達,重新定義“無接觸交互”尾門

4月25日&#xff0c;在2025上海國際汽車工業展覽會期間&#xff0c;全球領先的物聯網和車聯網整體解決方案供應商移遠通信宣布&#xff0c;其全新AR腳踢毫米波雷達RD7702AC正式發布。 該產品專為汽車尾門“無接觸交互”設計&#xff0c;基于先進的毫米波技術&#xff0c;融合AR…

深度學習:遷移學習

遷移學習 標題1.什么是遷移學習 遷移學習(Transfer Learning)是一種機器學習方法&#xff0c;就是把為任務 A 開發 的模型作為初始點&#xff0c;重新使用在為任務 B 開發模型的過程中。遷移學習是通過 從已學習的相關任務中轉移知識來改進學習的新任務&#xff0c;雖然大多數…

Rabbitmq下載和安裝(Windows系統,百度網盤)

一.下載安裝Erlang 1.百度云下載 鏈接&#xff1a;https://pan.baidu.com/s/1k_U25KKngEf1iXWD1ANOeg 提取碼&#xff1a;8ilc 2.安裝 傻瓜式安裝 直接下一步 選擇自己要安裝的路徑 3.配置環境變量 增加變量名為&#xff1a;ERLANG_HOME 變量值填寫自己的安裝路徑&#x…

(一)Linux的歷史與環境搭建

【知識預告】 Linux背景介紹Linux操作系統特性Linux的應用場景Linux的發行版本搭建Linux環境 1 Linux背景介紹 1.1 什么是Linux&#xff1f; Linux是一種自由、開源的操作系統。嚴格來說&#xff0c;它是基于類Unix設計思想&#xff0c;旨在為用戶提供穩定、安全、高效的計…

光流法:從傳統方法到深度學習方法

1 光流法簡介 光流&#xff08;Optical Flow&#xff09;是指圖像中像素灰度值隨時間的變化而產生的運動場。 簡單來說&#xff0c;它描述了圖像中每個像素點的運動速度和方向。 光流法是一種通過分析圖像序列中像素灰度值來計算光流的方法。對于圖像數據計算出來的光流是一個二…

解決ssh拉取服務器數據,要多次輸入密碼的問題

問題在于&#xff0c;每次循環調用 rsync 都是新開一個連接&#xff0c;所以每次都需要輸入一次密碼。為了只輸入一次密碼&#xff0c;有以下幾種方式可以解決&#xff1a; ? 推薦方案&#xff1a;設置 SSH 免密登錄 最穩最安全的方式是&#xff1a;配置 SSH 免密登錄&#x…

web技術與Nginx網站服務

目錄 一. web基礎 1. 域名概念 2. Hosts 文件 3. DNS 4. 域名注冊 5. 網頁與 HTML 二. 網頁概述 1. HTML 概述 2. HTML 基本標簽 3. 網站和主頁 三. 靜態網頁與動態網頁 1. 靜態網頁 2. 動態網頁 3. 動態網頁語言 四. HTTP 協議 1. HTTP 協議概述 2. HTTP …

信創系統資產清單采集腳本:主機名+IP+MAC 一鍵生成 CSV

原文鏈接&#xff1a;信創系統資產清單采集腳本&#xff1a;主機名IPMAC 一鍵生成 CSV Hello&#xff0c;大家好啊&#xff01;今天給大家帶來一篇在信創終端操作系統上自動批量采集主機名、IP 和 MAC 并導出為 CSV 表格的實戰文章&#xff01;本方案使用 sshpass 和 Bash 腳本…

【dify+docker安裝教程】

目錄 一、dify安裝包下載 二、運行環境配置 1、下載docker 2、安裝 2.1 新建文件夾 2.2 安裝 2.3 命令安裝 3.下載完成后需要重啟電腦&#xff0c;注意保存文檔&#xff01;&#xff01;注意保存&#xff01;&#xff01;注意&#xff01;&#xff01;&#xff08;血的教…

HTML 地理定位(Geolocation)教程

HTML 地理定位(Geolocation)教程 簡介 HTML5 的 Geolocation API 允許網頁應用獲取用戶的地理位置信息。這個功能可用于提供基于位置的服務&#xff0c;如導航、本地搜索、天氣預報等。本教程將詳細介紹如何在網頁中實現地理定位功能。 工作原理 瀏覽器可以通過多種方式確定…

協作開發攻略:Git全面使用指南 — 引言

協作開發攻略&#xff1a;Git全面使用指南 — 引言 Git 是一種分布式版本控制系統&#xff0c;用于跟蹤文件和目錄的變更。它能幫助開發者有效管理代碼版本&#xff0c;支持多人協作開發&#xff0c;方便代碼合并與沖突解決&#xff0c;廣泛應用于軟件開發領域。 文中內容僅限技…

畢業設計-基于預訓練語言模型與深度神經網絡的Web入侵檢測系統

項目技術說明 基于預訓練語言模型與深度神經網絡的Web入侵檢測系統&#xff0c;通過預訓練模型CodeBert分詞&#xff0c;將分詞輸入給BiGRU的深度學習模型訓練。通過sniff函數實時捕獲http流量信息&#xff0c;將流量信息輸入給模型進行檢測&#xff0c;模型可以檢測的類別有S…

[計算機科學#4]:二進制如何塑造數字世界(0和1的力量)

【核知坊】&#xff1a;釋放青春想象&#xff0c;碼動全新視野。 我們希望使用精簡的信息傳達知識的骨架&#xff0c;啟發創造者開啟創造之路&#xff01;&#xff01;&#xff01; 內容摘要&#xff1a; 二進制是計算機世界的基石&#xff0c;數學是世界的…

JUC中各種鎖機制的應用和原理及死鎖問題定位

JUC中各種鎖機制的應用和原理及死鎖問題定位 在互聯網大廠Java求職者的面試中&#xff0c;經常會被問到關于JUC&#xff08;Java Util Concurrency&#xff09;中的各種鎖機制及其應用和原理的問題。本文通過一個故事場景來展示這些問題的實際解決方案。 第一輪提問 面試官&…

配置Ubuntu18.04中的Qt Creator為中文(圖文詳解)

配置Qt Creator為中文 1、前言2、先設置Ubuntu系統語言為中文3、配置Qt Creator中文環境2.1 IBus輸入法&#xff08;方法一&#xff09;2.2、測試IBus輸入法2.21IBus輸入法終端中測試2.2.2IBus輸入法Qt Creator中測試 2.3、Fcitx輸入法&#xff08;方法二&#xff09;2.3.1安裝…

高性能服務器配置經驗指南3——安裝服務器可能遇到的問題及解決方法

文章目錄 1、重裝系統后VScode遠程連接失敗問題2、XRDP連接黑屏問題1. 打開文件2. 添加配置3. 重啟xrdp服務 3、VScode遠程免密連接問題4、Vim編輯文件時出現不同用戶沖突編輯的問題 在完成 服務器基本配置和 深度學習環境準備后&#xff0c;大家應該就可以正常使用服務器了&…