最小生成樹——Kruskal

標題什么是生成樹?

對于一張無向圖,由nnn個頂點和n?1n-1n?1條邊構成地聯通子圖,叫做這個無向圖 生成樹

最小生成樹就是指邊權之和最小的生成樹

請添加圖片描述

如何求最小生成樹?
Kruskal

介紹:

  1. 存圖時只存每條邊地起點、終點,而不關注節點之間的聯通關系,所以不需要鏈式前向星鄰接矩陣
  2. 然后使用邊權排序,想像自己獲得了nnn個點,現在需要給這nnn個點連邊。
  3. 循環遍歷存邊地數組,對于每條邊,取出它的兩個端點:xxxyyy,同時使用并查集記錄點與點之間是否聯通。如果聯通,則證明該點之間已經存在最優的邊(因為權值更小的邊已經排到前面去了,會被優先考慮)。如果不聯通,就連上這兩條邊,使用并查集記錄。
  4. 最后統計出該最小生成樹的所有邊的邊權之和
代碼實現

最小生成樹模板題目

#include<bits/stdc++.h>
using namespace std;
int read(){int s=0,fl=1;char w=getchar();while(w>'9'||w<'0'){if(w=='-')fl=-1;w=getchar();}while(w<='9'&&w>='0'){s=s*10+(w^48);w=getchar();}return fl*s;
}
void out(int x){if(x<0)putchar('-'),x=-x;if(x<10)putchar(x+'0');else out(x/10),putchar(x%10+'0');
}
struct ed{int v,x,y;
}mp[1000010];
int f[1000010],cnt;
bool cmp(ed x,ed y){return x.v<y.v;
}
int find(int x){if(f[x]!=x) f[x]=find(f[x]);return f[x];
}
int n,m,ans;
int main(){n=read();m=read();for(int i=1;i<=m;i++){mp[i].x=read();mp[i].y=read();mp[i].v=read();//存邊}sort(mp+1,mp+1+m,cmp);for(int i=1;i<=n;i++){f[i]=i;//初始化并查集}for(int i=1;i<=m;i++){int x=find(mp[i].x);int y=find(mp[i].y);if(x==y) continue;//如果最上層的祖先是一樣的,則證明已經聯通,跳過該條邊f[x]=y;//將兩條邊的祖先連在一起cnt++;ans+=mp[i].v;//統計和}cnt==n-1?printf("%d",ans):printf("orz");//判斷連上的節點數是否是整張圖的節點數,如果不是就證明原圖不連通,輸出orzreturn 0;
}

雙倍經驗

P1967 [NOIP 2013 提高組] 貨車運輸

由題意可得AAA國由nnn個點,mmm條邊構成,每條邊權重為zzz,貨車要從節點xxx走到節點yyy,每走一條邊,貨車的載重量不能超過當前邊的權值。
此題在想不到最小生成樹的情況下可以使用DijkstraDijkstraDijkstra,要求貨車最大的載重量,肯定優先選擇邊權更大的邊通過,于是設d[i]d[i]d[i]表示從節點xxx到節點iii的最大載重。判斷邏輯顯然可得:

if(new_dis>d[y]){d[y]=new_dis;

堆優化版DijkstraDijkstraDijkstra時間復雜度是O((V+E)logV) 但是這道題VVV=1e41e41e4,EEE=5e45e45e4,計算得最終為8.4e48.4e48.4e4,但是這只是單次DijkstraDijkstraDijkstra,算上詢問次數,總時間約是2.4e92.4e92.4e9,一定超時
如果用離線處理,效率會高一些,但是還是無法通過此題

正解

使用最小生成樹最近公共祖先(lca) 解決
因為無論如何貨車走的路都一定是最大邊權的邊,然而生成樹的性質有一條就是能聯通所有節點,所以我們可以先對這張圖求 最大生成樹

然后對于每個詢問xxxyyy,求出其最近公共祖先lll,然后在求lcalcalca途中維護w[i][j]w[i][j]w[i][j]表示從節點iii向上移動 2j 層后的最大值。

因為求lcalcalca的過程是倍增進行的,所以總時間復雜度是O(mlogm+nlogn+qlogn)O(m log m + n log n + q log n)O(mlogm+nlogn+qlogn)

#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int read(){int s=0,fl=1;char w=getchar();while(w>'9'||w<'0'){if(w=='-')fl=-1;w=getchar();}while(w<='9'&&w>='0'){s=s*10+(w^48);w=getchar();}return fl*s;
}
void out(int x){if(x<0)putchar('-'),x=-x;if(x<10)putchar(x+'0');else out(x/10),putchar(x%10+'0');
}
int n,m,q;
int d[N],f[N],dep[N],fa[N][21];
int head[N],ne[N],to[N],v[N],tot,vis[N],w[N][21];
struct node{int x,y,v;
}mp[N];
bool cmp(node x,node y){return x.v>y.v;//求最大生成樹
}
int find(int x){if(f[x]!=x) f[x]=find(f[x]);return f[x];
}
void add(int x,int y,int w){to[++tot]=y;ne[tot]=head[x];head[x]=tot;v[tot]=w;
}
void dfs(int x){vis[x]=1;for(int i=head[x];i;i=ne[i]){int u=to[i];if(vis[u]){continue;}dep[u]=dep[x]+1;fa[u][0]=x;w[u][0]=v[i];dfs(u);}
}
void kru(){for(int i=1;i<=n;i++){f[i]=i;}sort(mp+1,mp+1+m,cmp);for(int i=1;i<=m;i++){int x=find(mp[i].x);int y=find(mp[i].y);if(x==y){continue;}f[x]=y;add(mp[i].x,mp[i].y,mp[i].v);add(mp[i].y,mp[i].x,mp[i].v);}
}
int lca(int x,int y){if(find(x)!=find(y)){return -1;}int ans=2e9;if(dep[x]<dep[y]){swap(x,y);}for(int k=20;k>=0;k--){if(dep[fa[x][k]]>=dep[y]){ans=min(ans,w[x][k]);x=fa[x][k];}}if(x==y) return ans;for(int k=20;k>=0;k--){if(fa[x][k]!=fa[y][k]){x=fa[x][k];y=fa[y][k];}}ans=min(ans,min(w[x][0],w[y][0]));return ans;
}
int main(){n=read();m=read();for(int i=1;i<=m;i++){int x=read();int y=read();int v=read();mp[i].x=x;mp[i].y=y;mp[i].v=v;}q=read();kru();for(int i=1;i<=n;i++){if(vis[i]==1) continue;dep[i]=1;dfs(i);fa[i][0]=i;w[i][0]=2e9;}for(int i=1;i<=20;i++){for(int j=1;j<=n;j++){fa[j][i]=fa[fa[j][i-1]][i-1];w[j][i]=min(w[j][i-1],w[fa[j][i-1]][i-1]);//預處理倍增表}}for(int i=1;i<=q;i++){int x=read();int y=read();out(lca(x,y));putchar('\n');}return 0;
}

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

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

相關文章

ADFS 和 OAuth 的區別

ADFS 和 OAuth 的區別 ADFS(Active Directory Federation Services)和 OAuth 都是身份認證與授權領域的技術,但它們的設計目標、應用場景和實現方式有顯著區別。以下從核心定義、技術特性、應用場景等方面詳細對比: 核心定義與設計目標 技術 核心定義 設計目標 ADFS 微軟…

神經網絡參數量計算詳解

1. 神經網絡參數量計算基本原理 1.1 什么是神經網絡參數 神經網絡的參數主要包括&#xff1a; 權重&#xff08;Weights&#xff09;&#xff1a;連接不同神經元之間的權重矩陣偏置&#xff08;Bias&#xff09;&#xff1a;每個神經元的偏置項批歸一化參數&#xff1a;BatchNo…

手寫鏈路追蹤

1. 什么是鏈路追蹤 鏈路追蹤是指在分布式系統中&#xff0c;將一次請求的處理過程進行記錄并聚合展示的一種方法。目的是將一次分布式請求的調用情況集中在一處展示&#xff0c;如各個服務節點上的耗時、請求具體到達哪臺機器上、每個服務節點的請求狀態等。這樣就可以輕松了解…

從零開始的python學習——常量與變量

? ? ? ? ? づ?ど &#x1f389; 歡迎點贊支持&#x1f389; 個人主頁&#xff1a;勵志不掉頭發的內向程序員&#xff1b; 專欄主頁&#xff1a;python學習專欄&#xff1b; 文章目錄 前言 一、常量和表達式 二、變量類型 2.1、什么是變量 2.2、變量語法 &#xff08;1&a…

基于51單片機環境監測設計 光照 PM2.5粉塵 溫濕度 2.4G無線通信

1 系統功能介紹 本設計是一套 基于51單片機的環境監測系統&#xff0c;能夠實時采集環境光照、PM2.5、溫濕度等參數&#xff0c;并通過 2.4G無線模塊 NRF24L01 實現數據傳輸。系統具備本地顯示與報警功能&#xff0c;可通過按鍵設置各類閾值和時間&#xff0c;方便用戶進行環境…

【Flask】測試平臺開發,產品管理實現添加功能-第五篇

概述在前面的幾篇開發文章中&#xff0c;我們只是讓數據在界面上進行了展示&#xff0c;但是沒有添加按鈕的功能&#xff0c;接下來我們需要開發一個添加的按鈕&#xff0c;用戶產品功能的創建和添加抽公共數據鏈接方法添加接口掌握post實現和請求數據處理前端掌握Button\Dilog…

循環高級(2)

6.練習3 打印九九乘法表7.練習3 制表符詳解對齊不了原因&#xff1a;name補到8zhangsan本身就是8&#xff0c;補完就變成16解決辦法&#xff1a;1.去掉zhangsan\t,這樣前后都是82.name后面加2個\t加一個\t&#xff0c;name\t就是占8個&#xff0c;再加一個\t&#xff0c;就變成…

盒馬生鮮 小程序 逆向分析

聲明 本文章中所有內容僅供學習交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包內容、敏感網址、數據接口等均已做脫敏處理&#xff0c;嚴禁用于商業用途和非法用途&#xff0c;否則由此產生的一切后果均與作者無關&#xff01; 逆向分析 部分python代碼 params {&…

【Linux系統】線程控制

1. POSIX線程庫 (pthreads)POSIX線程&#xff08;通常稱為pthreads&#xff09;是IEEE制定的操作系統線程API標準。Linux系統通過glibc庫實現了這個標準&#xff0c;提供了創建和管理線程的一系列函數。核心特性命名約定&#xff1a;絕大多數函數都以 pthread_ 開頭&#xff0c…

【Spring Cloud Alibaba】前置知識

【Spring Cloud Alibaba】前置知識1. 微服務介紹1.1 系統架構的演變1.1.1 單體應用架構1.1.2 垂直應用架構1.1.3 分布式架構1.1.3.1 SOA架構1.1.4 微服務架構1. 微服務介紹 1.1 系統架構的演變 隨著互聯網的發展&#xff0c;網站應用的規模也在不斷的擴大&#xff0c;進而導致…

2025互聯網大廠Java面試1000道題目及參考答案

Java學到什么程度可以面試工作&#xff1f; 要達到能夠面試Java開發工作的水平&#xff0c;需要掌握以下幾個方面的知識和技能&#xff1a; 1. 基礎扎實&#xff1a;熟悉Java語法、面向對象編程概念、異常處理、I/O流等基礎知識。這是所有Java開發者必備的基礎&#xff0c;也…

記錄:HSD部署(未完成)

建數據庫 相關文檔&#xff1a;Confluence準備&#xff1a;CA文件和備份用的aws key。 CA文件&#xff1a;在namespace添加trust-injectionenabled的標簽&#xff0c;會自動生成。 aws key&#xff1a;生成cnpg-backup-creds的secret。安裝&#xff1a; 從git倉庫獲取values模…

【AI】提示詞與自然語言處理:從NLP視角看提示詞的作用機制

提示詞與自然語言處理&#xff1a;從 NLP 視角看提示詞的作用機制在人工智能快速發展的今天&#xff0c;大模型成為了人們關注的焦點。而要讓大模型更好地理解人類意圖、完成各種任務&#xff0c;提示詞扮演著關鍵角色。從自然語言處理&#xff08;NLP&#xff09;的角度來看&a…

2025.8.29機械臂實戰項目

好久沒給大家更新了&#xff0c;上周末大學大四開學&#xff0c;所以停更了幾天&#xff0c;回來后在做項目&#xff0c;接下來的幾篇文章&#xff0c;給大家帶來幾個項目&#xff0c;第一個介紹的是機械臂操作&#xff0c;說是機械臂操作&#xff0c;簡單來說&#xff0c;就是…

【機器學習基礎】機器學習的要素:任務T、性能度量P和經驗E

第一章 機器學習的本質與理論框架 機器學習作為人工智能領域的核心支柱,其理論基礎可以追溯到20世紀中葉的統計學習理論。Tom Mitchell在其1997年的經典著作《Machine Learning》中給出了一個至今仍被廣泛引用的學習定義:"對于某類任務T和性能度量P,一個計算機程序被認…

wav音頻轉C語言樣點數組

WAV to C Header Converter 將WAV音頻文件轉換為C語言頭文件的Python腳本&#xff0c;支持將音頻數據嵌入到C/C項目中。 功能特性 音頻格式支持 PCM格式&#xff1a;支持8位、16位、24位、32位PCM音頻IEEE Float格式&#xff1a;支持32位浮點音頻多聲道&#xff1a;支持單聲道、…

01.《基礎入門:了解網絡的基本概念》

網絡基礎 文章目錄網絡基礎網絡通信核心原理網絡通信定義信息傳遞過程關鍵術語解釋網絡的分類網絡參考模型OSI 參考模型各層核心工作分層核心原則TCP/IP 參考模型&#xff08;4 層 / 5 層&#xff0c;實際應用模型&#xff09;TCP/IP 與 OSI 模型的對應關系傳輸層核心協議&…

基于vue駕校管理系統的設計與實現5hl93(程序+源碼+數據庫+調試部署+開發環境)帶論文文檔1萬字以上,文末可獲取,系統界面在最后面。

系統程序文件列表&#xff1a;項目功能&#xff1a;學員,教練,教練信息,預約信息,場地信息,時間安排,車輛信息,預約練車,時間段,駕校場地信息,駕校車輛信息,預約報名開題報告內容&#xff1a;一、選題背景與意義背景隨著汽車保有量持續增長&#xff0c;駕校行業規模不斷擴大&am…

灰度思維:解鎖世界原有本色的密碼

摘要本文深入探討灰度思維的概念內涵及其在處理他人評價中的應用價值。研究指出&#xff0c;灰度思維作為一種超越非黑即白的思維方式&#xff0c;能夠幫助個體以更客觀、全面的態度接受他人評價的片面性&#xff0c;從而促進個人成長和人際關系和諧。文章分析了他人評價片面性…

動態規劃--Day03--打家劫舍--198. 打家劫舍,213. 打家劫舍 II,2320. 統計放置房子的方式數

動態規劃–Day03–打家劫舍–198. 打家劫舍&#xff0c;213. 打家劫舍 II&#xff0c;2320. 統計放置房子的方式數 今天要訓練的題目類型是&#xff1a;【打家劫舍】&#xff0c;題單來自靈艾山茶府。 掌握動態規劃&#xff08;DP&#xff09;是沒有捷徑的&#xff0c;咱們唯一…