1. 程式人生 > >貪心法之最小生成樹之Kruskal演算法

貪心法之最小生成樹之Kruskal演算法

#include "iostream" using namespace std; #define MAXVEX 50//圖中最大節點數 typedef struct //定義邊的資料結構 { int start;//邊的起點 int end;//邊的終點 float weight;//邊的權值 }VertexType; typedef struct //定義鄰接矩陣的資料結構 { char vexs[MAXVEX]; VertexType edges[MAXVEX]; int vexNum, adgeNum;//分別表示圖中節點個數和邊的條數 }AGraph; int main() { void createAGraph(AGraph *); void kruskal(AGraph *, VertexType[]); AGraph g; VertexType v[MAXVEX]; createAGraph(&g); kruskal(&g, v); return 0; } //kruskal演算法求解最小生成樹 //g為無向網,v用於儲存最小生成樹的邊 void kruskal(AGraph *g, VertexType v[]) { void selectSort(VertexType[], int); int collect[MAXVEX]; for(int i = 0; i < g->vexNum; ++i) collect[i] = i; selectSort(g->edges, g->adgeNum); int min;//分別表示最小的生成樹的總權值和當前樹的節點數 min = 0; cout<<"\n最小生成樹由這些邊構成:\n"; for(int j = 0; (j < g->adgeNum); ++j)// { int s = g->edges[j].start; int e = g->edges[j].end; //下面就是判斷一條邊的兩個端點是否同在已加入邊的端點集合中 while(s != collect[s]) s = collect[s]; while(e != collect[e]) e = collect[e]; if(s != e)//如果不在同一集合中,說明加入該條邊不會構成迴路 { v[j] = g->edges[j]; min += g->edges[j].weight; collect[e] = s;//將這兩個端點加到同一個集合中去 cout<<g->vexs[g->edges[j].start]<<"->"<<g->vexs[g->edges[j].end]<<",";//輸出邊的資訊 } } cout<<"\n最小生成樹的總權重為:"<<min<<endl; } //用選擇排序對n條邊進行排序 void selectSort(VertexType edges[], int n) { int min; VertexType temp; for(int i = 0; i < n - 1; ++i) { min = i; //迴圈找出剩餘元素中最小的一個 for(int j = i + 1; j < n; ++j) { if(edges[min].weight > edges[j].weight) { min = j; } } //將最小值與第一個元素交換位置 if(min != i) { temp = edges[i]; edges[i] = edges[min]; edges[min] = temp; } } } void createAGraph(AGraph *g)//建立圖的無向網 { int vNum, aNum;//分別代表要建立的圖的節點數和邊數 int start, end;//start->end表示節點start和end之間有一條邊 int weight;//邊的權重 cout<<"請輸入圖中節點的個數和邊的條數:"; cin>>vNum>>aNum; printf("\n請輸入%d個節點的資訊:", vNum); //建立節點 for(int i = 0; i < vNum; ++i) { cin>>g->vexs[i]; } cout<<"這裡輸出節點編號及其儲存的節點資訊"<<endl; for(int k = 0; k < vNum; ++k) cout<<k<<":"<<g->vexs[k]<<""; cout<<endl; //建立無向圖的邊資訊 for(int j = 0; j < aNum; ++j) { cout<<"\n請輸入第"<<j+1<<"條邊的start和end節點和邊的權重weight:"; cin>>start>>end>>weight; g->edges[j].start = start; g->edges[j].end = end; g->edges[j].weight = weight; } //初始化vexNum和adgeNum g->vexNum = vNum; g->adgeNum = aNum; } 執行結果:

相關推薦

貪心演算法基礎小生成樹 51nod Kruskal演算法

問題: 分析: 演算法思想: 1、把存在的邊按邊長進行排序,從小到大。目的是從小的邊開始遍歷,以便找最小生成樹 推薦用結構體存邊,不要用鄰接矩陣存關係 把n個點連線在一起,起始最少需要

貪心小生成樹Kruskal演算法

#include "iostream" using namespace std; #define MAXVEX 50//圖中最大節點數 typedef struct //定義邊的資料結構 { int start;//邊的起點 int end;//邊的終點 float weight;//邊的權值 }Verte

例題:短網路 圖論演算法小生成樹 prim//kruskal 學習筆記

圖論演算法之最小生成樹  prim//kruskal         最小生成樹簡單的說就是在一個圖裡選取一些邊,使這些邊以及它們所連線的結點組成一棵樹(兩兩結點之間可以到達),並且使選取的邊的邊權最

小生成樹Kruskal演算法——加邊 (並查集優化 + C++語言編寫 + 例題)

『演算法原理』          在一個連通網的所有生成樹中,各邊的代價之和最小的那顆生成樹稱為該連通網的最小代價生成樹(Minimum Cost Spanning Tree),簡稱最小生成樹(MST)。         Kruskal演算法之所以叫加邊法,就是因為其本質

演算法java實現--貪心演算法--小生成樹問題--Kruskal演算法

最小生成樹問題(Kruskal演算法)的java實現(貪心演算法) 具體問題描述以及C/C++實現參見網址 http://blog.csdn.net/liufeng_king/article/details/8738161 import java.util.Colle

小生成樹Kruskal 演算法和 Prim 演算法)——貪心演算法(C語言)

  本內容將介紹最小生成樹(MST:Minimum Cost Spanning Tree)的兩種解法,分別為 Kruskal 演算法(克魯斯卡爾演算法)和 Prim 演算法(普里姆演算法),並且它們都屬於貪心演算法。 問題描述:   產生最小生成樹(MS

小生成樹Kruskal演算法)POJ 2349 Arctic Network

Description The Department of National Defence (DND) wishes to connect several northern outposts by a wireless network. Two different com

資料結構 第17講 溝通無限校園網——小生成樹kruskal演算法

本內容來源於本人著作《趣學演算法》,線上章節:http://www.epubit.com.cn/book/details/4825 構造最小生成樹還有一種演算法,Kruskal演算法:設G=(V,E)是無向連通帶權圖,V={1

HDU 1162.Eddy's picture【小生成樹Kruskal演算法)】【5月30】

Eddy's picture Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 8871    Accepte

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

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

poj1258 Agri-Net 小生成樹kruskal演算法

思路:原始的最小生成樹。第一次寫kruskal演算法,一開始老是RE,還不明白怎麼了,原來連kruskal的過程都忘了。對不起資料結構老師。。。 ///2014.7.7 ///poj1258 /* *最小生成樹,kruskal演算法 */ #include <

ZOJ 1203 Swordfish 劍魚行動 小生成樹Kruskal演算法

Swordfish Time Limit: 2 Seconds      Memory Limit: 65536 KB There exists a world within our world A world beneath what we call cybersp

【圖論-MST】POJ 1251 Jungle Roads 叢林中的道路,小生成樹Kruskal演算法

Jungle RoadsTime Limit: 2 Seconds      Memory Limit: 65536 KBThe Head Elder of the tropical island of Lagrishan has a problem. A burst of

【NOJ1596、1597】【貪心演算法小生成樹】最少修建多長的公路能把所有村莊連起來(圖示Prim與Kruskal演算法

1596.最少修建多長的公路能把所有村莊連起來(一) 時限:1000ms 記憶體限制:10000K  總時限:3000ms 描述 一個地區有n個村莊,有一些村子之間可以修路,已知每條路的長度,問最少修建多長的公路可以把所有的村子連線起來。 輸入 先輸入兩個正整數n,

貪心演算法(Greedy Algorithm)小生成樹 克魯斯卡爾演算法(Kruskal's algorithm)

克魯斯卡爾演算法(Kruskal's algorithm)是兩個經典的最小生成樹演算法的較為簡單理解的一個。這裡面充分體現了貪心演算法的精髓。大致的流程可以用一個圖來表示。這裡的圖的選擇借用了Wikipedia上的那個。非常清晰且直觀。 首先第一步,我們有一張圖,有若干點和

小生成樹Kruskal

ios while 最小 func pre num pri str -s 思路:(貪心) 排序邊的權值,按從小到大排序,然後從最小權值開始,一直連接點(把他們的父親變成同一個),最後連成的樹就是最小生成樹 代碼實現(hdu 1233) #include <stdio.

小生成樹Prim算

mark 分類 unsigned 最短 數學 沒有 下一個 數量 emp 普裏姆算法(Prim算法),圖論中的一種算法。可在加權連通圖裏搜索最小生成樹。意即由此算法搜索到的邊子集所構成的樹中,不但包含了連通圖裏的全部頂點。且其全部邊的權值

小生成樹(繼續暢通工程)

沒有 roo space als pri () 最短 con include 個人比較愛好刷算法題,然後最近遇到一個算法題,是最小生成樹的問題,是繼續暢通工程,首先先看下具體要求: 省政府“暢通工程”的目標是使全省任何兩個村莊間都可以實現公路交通(但不一定有直接的公路相連,

數據結構小生成樹(普裏姆算)

下一個 iostream 算法 -a mgr height 實例 AI cat 1)普裏姆算法 可取圖中任意一個頂點v作為生成樹的根,之後若要往生成樹上添加頂點w,則在頂點v和頂點w之間必定存在一條邊,並且 該邊的權值在所有連通頂點v和w之間的邊中取值最小。一般情況下,

JS實現小生成樹克魯斯卡爾(Kruskal演算法

  克魯斯卡爾演算法列印最小生成樹:   構造出所有邊的集合 edges,從小到大,依次選出篩選邊列印,遇到閉環(形成迴路)時跳過。 JS程式碼: 1 //定義鄰接矩陣 2 let Arr2 = [ 3 [0, 10, 65535, 65535, 65535,