題目描述
如題,給出乙個無向圖,求出最小生成樹
輸入輸出格式
輸入格式:
第一行包含兩個整數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 測試輸入包含若干測試用例。每個測...