1. 程式人生 > >圖的最小生成樹kruskal演算法總結

圖的最小生成樹kruskal演算法總結

kruskal演算法的思想

假如N={V,{E}}是連通網,那麼最小生成樹的初始狀態是由V個頂點自成連通分量構成的一片森林。在E中選擇權值最小的邊,當該邊對應的兩個頂點在不同分量時,則將該邊加入到最小生成樹中,否則的捨去,再選擇下一條代價最小的邊,如此迴圈,直到所有的連通分量連線變成一個連通分量為止。

看看具體程式碼

public void minSpanTree_kurskal(Edges[] edges){  //edges已按照權值大小進行了非遞減排序
		
		Integer parent[] = new Integer[edges.length];
		int n,m;
		for(int i=0;i<edges.length;i++){   //初始化parent[]全部元素為0;
			parent[i] = 0;
		}
		
		for(int i=0;i<edges.length;i++){
			n = find(parent,edges[i].begin);  //尋找edges[i].begin所在連通分量的根頂點
			m = find(parent,edges[i].end);  //尋找edges[i].end所在連通分量的根頂點
			
			if(n!=m){      // 如果根結點不同說明dges[i].begin和dges[i].end在不同分量上
				parent[n] = m;
				System.out.println("begin="+edges[i].begin+","+"end="+edges[i].end+","+"weight="+edges[i].weight);
			}
		}
			
	}
private int find(Integer[] parent, int f) {
		
		while(parent[f]>0)
			f = parent[f];
		return f;
		
	}


這裡存在一個問題:如何判斷2個頂點在同一個連通分量?

每個連通分量上都有一個頂點代表整個連通分量,我們把它叫做根頂點,也就是通過find()方法我們可以找到該頂點所在連通分量的根頂點,如果兩個頂點的根頂點相同,則代表這兩個頂點在同一個連通分量上,反之則不是。

演算法執行詳解

1.用邊集陣列儲存圖,然後再按照權值大小進行非遞減排好序,結果如下圖所示


2.初始化parent[],結果如下圖

值全部為0也就代表每一個頂點自稱一個連通分量

3.取權值最小的邊

4.呼叫find方法得到頂點所在連通分量的根頂點

注:其實每個連通分量的全部頂點可以看成類似樹,但此樹的邊總是從子結點指向父節點,最後樹的根即為根頂點,

如當迴圈到edges[6]時,有如下圖所示結果


如上圖所示,通過parent[]陣列可以畫出兩個類似樹的連通分量,其中7和6分別為森林中兩個不同的連通分量的根頂點。如要判斷頂點5所在連通分量的根頂點是什麼,圖中可看到5的父結點為8,8的父節點為6,6的父結點為空,說明6即為連通分量的根節點。

5.如果兩個頂點的根頂點不同,說明兩個頂點在不同的連通分量上,將該邊加入最小生成樹中,否則捨棄。

6.取最小權值的邊不斷迴圈......

相關推薦

小生成樹kruskal演算法總結

kruskal演算法的思想 假如N={V,{E}}是連通網,那麼最小生成樹的初始狀態是由V個頂點自成連通分量構成的一片森林。在E中選擇權值最小的邊,當該邊對應的兩個頂點在不同分量時,則將該邊加入到最小生成樹中,否則的捨去,再選擇下一條代價最小的邊,如此迴圈,直到所有的連通

小生成樹Kruskal演算法

克魯斯卡爾(Kruskal)演算法(只與邊相關) 演算法描述:克魯斯卡爾演算法需要對圖的邊進行訪問,所以克魯斯卡爾演算法的時間複雜度只和邊又關係,可以證明其時間複雜度為O(eloge)。 演算法過程: 1.將圖各邊按照權值進行升序排序 2.將圖遍歷一次,找出權值最小的邊,(條件

小生成樹 Kruskal演算法 Prim演算法

一.實際問題 最小生成樹一般應用在網(帶權的圖)問題中,實際問題一般比如:   假設要在n個城市間建立通訊聯絡網,則聯通n個城市只需要n-1條線路,但是每兩個城市間都可以建設路線,而且城市與城市間建設代價是不同的,這就需要我們考慮一種經濟的聯絡方式。 將問

資料結構實驗之論六:村村通公路——小生成樹Kruskal演算法

Think: 1知識點:最小生成樹Kruskal演算法(並查集思想) 2反思:注意變數初始化 以下為Accepted程式碼 #include <bits/stdc++.h> using namespace std; struct

小生成樹Kruskal演算法樸素版(C++)

Kruskal演算法先將所有的邊按權值由小到大排序,然後從無開始(即每個頂點都是一棵子樹),每次選取權值最小又不會構成迴路的邊作為最終最小生成樹的一部分。最終能夠將多個不連通的子樹聯合起來構成最小生成樹。 時間複雜度為O(ElogE+V2)。E為圖中的邊數,V

小生成樹-kruskal演算法(非並查集的實現&優先佇列的sh xian&並查集的實現)

kruskal演算法:構造一個只含n個頂點,而邊集為空的子圖,若將該子圖中各個頂點看成是各棵樹的根節點,則它是一個含有n棵樹的森林 。之後,從網的邊集中選取一條權值最小的邊,若該邊的兩個頂點分屬不同的樹 ,則將其加入子圖,也就是這兩個頂點分別所在的 兩棵樹合成一棵樹;反之,若該邊的兩個頂點已落在同一

小生成樹 - Kruskal演算法

Kruskal演算法 第二種最小生成樹演算法 —— Kruskal演算法 按照邊的權重順序(從小到大)處理它們,將邊加入最小生成樹中,加入的邊不會與已經加入的邊構成環,直到樹中含有 V

(Java資料結構和演算法小生成樹---Kruskal演算法(並查集)

該文章利用prime演算法求得連通圖的最小生成樹對應的邊權最小和,prime演算法是從頂點的角度思考和解決問題。本文介紹的Kruskal演算法將從邊的角度考慮並解決問題,利用了並查集方便地解決了最小生成樹的問題。 本文參考博文 //並查集 class UnionSameSet{

模板--小生成樹 Kruskal 演算法不詳解

最小生成樹   是由n個節點的連通圖變化來的。這棵樹滿足如下條件:     1、是原來圖的子圖(原來的圖扣去了幾條邊)     2、在保證圖仍然連通的情況下,剩下的邊權和是最小的     3、滿足樹的性質   最小生成樹常用來解決這樣的問題:     有n個村莊,他們之間本沒有路(走的人多了就有路了)。我們現

10-25 小生成樹——kruskal演算法學習——經典例題及自編模版

---------------題目--------------- 1078 最小生成樹  時間限制: 1 s  空間限制: 128000 KB  題目等級 : 白銀 Silver 題解 題目描述 Description

小生成樹kruskal演算法(貪心+並查集+堆優化)

kruskal演算法克魯斯卡爾演算法的基本思想是以邊為主導地位,始終選擇當前可用(所選的邊不能構成迴路)的最小權植邊。所以Kruskal演算法的第一步是給所有的邊按照從小到大的順序排序。這一步可以直接使用庫函式qsort或者sort。接下來從小到大依次考察每一條邊(u,v)。

小生成樹---Kruskal演算法---挑戰程式設計競賽讀書筆記

測試資料也一樣。 這個演算法用到並查集來高效的判斷頂點u,v是否屬於同一個聯通分量。 程式碼: #include <iostream> #include <cstring> #include <cstdlib> #include &

小生成樹-Kruskal演算法(模板)

Kruskal基本演算法:每次選取最短的邊,看該邊相連的兩點是否在同一集合內,若在,則跳過,若不在,就把兩個點合併,判斷與合併都用並查集實現。 Kruskal的複雜度是O(ElogE),適合稀疏圖。

小生成樹 Kruskal演算法

關於最小生成樹的概念,請參考前一篇文章:Prim演算法。 Kruskal演算法: 不停地迴圈,每一次都尋找兩個頂點,這兩個頂點不在同一個真子集裡,且邊上的權值最小。 把找到的這兩個頂點聯合起來。 初始時,每個頂點各自屬於自己的子集合,共n個子集合。 每

小生成樹 kruskal演算法 C++實現

#include <iostream> #include <vector> #include <algorithm> #define Inf 0x7fffffff u

小生成樹——Kruskal演算法和Prim演算法

關於圖的幾個概念定義: 連通圖:在無向圖中,若任意兩個頂點vi” role=”presentation”>vivi都有路徑相通,則稱該無向圖為連通圖。 強連通圖:在有向圖中,若任意兩個頂點vi” role=”presentation”>vivi都有

51nod 1212 無向小生成樹prim演算法

N個點M條邊的無向連通圖,每條邊有一個權值,求該圖的最小生成樹。 Input 第1行:2個數N,M中間用空格分隔,N為點的數量,M為邊的數量。(2 <= N <= 1000

小生成樹Kruskal演算法—python實現

兩種實現方法class DisjointSet(dict): '''不相交集''' def __init__(self, dict): pass def add(self, item): self[item] = i

小生成樹-kruskal演算法

概述 定義 圖的生成樹時它的一棵含有其所有頂點的無環連通子圖。 加權圖的最小生成樹是它的一棵權重和最小的生成樹。 從上面的定義可以看出,生成樹就是一個極小連通子圖,而最小生成樹是針對加權圖而言的。 引例 首先考慮無權圖這一簡單情況

1251 Jungle Roads 小生成樹Kruskal演算法(模板)

Kruskal演算法比Prim更好寫#include<iostream> #include<cstdio> #include<algorithm> #define