模板 最小生成樹 kruskal演算法

2021-08-08 08:39:35 字數 1378 閱讀 7614

題目描述

如題,給出乙個無向圖,求出最小生成樹

輸入輸出格式

輸入格式:

第一行包含兩個整數n、m,表示該圖共有n個結點和m條無向邊。(n<=5000,m<=200000)

接下來m行每行包含三個整數xi、yi、zi,表示有一條長度為zi的無向邊連線結點xi、yi

輸出格式:

輸出包含乙個數,即最小生成樹的各邊的長度之和

輸入輸出樣例

輸入樣例#1:

4 5

1 2 2

1 3 2

1 4 3

2 3 4

3 4 3

輸出樣例#1:

7 說明

時空限制:1000ms,128m

資料規模:

對於20%的資料:n<=5,m<=20

對於40%的資料:n<=50,m<=2500

對於70%的資料:n<=500,m<=10000

對於100%的資料:n<=5000,m<=200000

所以最小生成樹的總邊權為2+2+3=7

這道題目呢,在入門的時候講過prim演算法。這裡對於prim演算法進行簡單的介紹。prim演算法,就是把所有的點劃在a集合裡面,然後每次選擇乙個點到b集合(滿足ab結點的交叉邊保持最小)然後邊數達到n-1的時候就成功了。

克魯斯卡爾

克魯斯卡爾就是基於並查集的。把每個點都看成乙個集合,然後對每條邊進行按權值從小到大排序,如果當前邊的兩個端點不在乙個集合裡面(查),那就,並他;在乙個集合裡面就,不要他。(哈哈哈還是我講的貪心演算法的應用)

#include

using

namespace

std;

int n,m,cc=0,sum=0;

struct edge

a[200200];

//用來存放所有的邊,l和r是兩個端點,v是權值

int top;

int father[6000];

//用來存放所有結點的父親

void read()

for(int i=1;i<=n;i++)

father[i]=i;

}//讀入和初始化

bool mycmp(edge x,edge y)

//獲取根結點

void un(int x,int y)

//並集

bool judge(int x,int y)

//查點

void work()

}int main()

模板 最小生成樹 Kruskal

兩種寫法 第一種 使用陣列 時間複雜度 o nlogn includeusing namespace std define max 200000 10 int n,m n 結點的數量 m 邊的數量 int u max v max w max r max p max u i v i 第i條邊的兩端點,...

模板 最小生成樹Kruskal

基本介紹 模板題目 實現 最小生成樹問題一般有兩種解法 prim和kruskal 因為之前學過並查集所以果斷選擇先學後者 kruskal是一種利用並查集來求解最小生成樹的演算法 它將每乙個聯通塊當作乙個集合 先將邊按從小到大的順序排序 現在每乙個點都是孤立的 並且自己成為乙個集合 然後按排好的順序列...

最小生成樹(模板 Kruskal)

description 某省調查鄉村交通狀況,得到的統計表中列出了任意兩村莊間的距離。省 暢通工程 的目標是使全省任何兩個村莊間都可以實現公路交通 但不一定有直接的公路相連,只要能間接通過公路可達即可 並要求鋪設的公路總長度為最小。請計算最小的公路總長度。input 測試輸入包含若干測試用例。每個測...