貪心演算法基礎之最小生成樹 51nod Kruskal演算法
問題:
分析:演算法思想:
1、把存在的邊按邊長進行排序,從小到大。目的是從小的邊開始遍歷,以便找最小生成樹
推薦用結構體存邊,不要用鄰接矩陣存關係
把n個點連線在一起,起始最少需要n-1跳變就夠了。因此我們從那m條邊裡選出n-1條邊就夠了
2、遍歷每一條邊。應用並查集,檢視每條邊的兩個端點之間是否相通,如果不相通,這條邊就需要連線
3、重複2步驟,直到連線的邊達到n-1條,就結束。最小生成樹就形成了
程式碼
//Kruskal #include<stdio.h> #include<string.h> #include<stdlib.h> #include<algorithm> using namespace std; const int INF=5555555; struct side{ int s,t; int len; }s[55555]; int pre[1100];//並查集用的前驅陣列 int n,m; bool cmp(side a,side b) { return a.len<b.len; } int find(int x) { if(pre[x]==0) return x; return pre[x]=find(pre[x]); } int main() { while(~scanf("%d%d",&n,&m)) { memset(pre,0,sizeof(pre)); for(int i=0;i<m;i++) { int s1,t,w; scanf("%d%d%d",&s1,&t,&w); s[i].s=s1; s[i].t=t; s[i].len=w; } sort(s,s+m,cmp); int sum=0; int count=0; for(int i=0;i<m && count<n-1;i++) { //記下兩端點的隊長 int fx=find(s[i].s); int fy=find(s[i].t); if(fx!=fy)//不在一個集合 { pre[fx]=fy; sum+=s[i].len; count++; } } printf("%d\n",sum); } return 0; }
相關推薦
貪心演算法基礎之最小生成樹 51nod Kruskal演算法
問題: 分析: 演算法思想: 1、把存在的邊按邊長進行排序,從小到大。目的是從小的邊開始遍歷,以便找最小生成樹 推薦用結構體存邊,不要用鄰接矩陣存關係 把n個點連線在一起,起始最少需要
51nod 1212 無向圖最小生成樹(Kruskal演算法)
收藏 關注 N個點M條邊的無向連通圖,每條邊有一個權值,求該圖的最小生成樹。 Input 第1行:2個數N,M中間用空格分隔,N為點的數量,M為邊的數量。(2 <= N <= 1000, 1 <= M <= 5
演算法總結之最小生成樹
最小生成樹的作用: 有很多點,點點之間有很多邊,邊有邊權,我們要選擇一些邊,將所有點互相聯通,構成一顆樹,即為最小生成樹 模板題:http://codevs.cn/problem/1231/ 演算法: prim 基本流程:開始從所有點 中任取一點,(通常取1號)
例題:最短網路 圖論演算法之最小生成樹 prim//kruskal 學習筆記
圖論演算法之最小生成樹 prim//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演算法——加邊法 (並查集優化 + C++語言編寫 + 例題)
『演算法原理』 在一個連通網的所有生成樹中,各邊的代價之和最小的那顆生成樹稱為該連通網的最小代價生成樹(Minimum Cost Spanning Tree),簡稱最小生成樹(MST)。 Kruskal演算法之所以叫加邊法,就是因為其本質
最小生成樹 (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
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,
貪心法之最小生成樹之Kruskal演算法
#include "iostream" using namespace std; #define MAXVEX 50//圖中最大節點數 typedef struct //定義邊的資料結構 { int start;//邊的起點 int end;//邊的終點 float weight;//邊的權值 }Verte
經典演算法6:貪心演算法之最小生成樹
1、問題描述 設G =(V,E)是無向連通帶權圖,即一個網路。E中每條邊(v,w)的權為c[v][w]。如果G的子圖G’是一棵包含G的所有頂點的樹,則稱G’為G的生成樹。生成樹上各邊權的總和稱為該生成樹的耗費。在G的所有生成樹中,耗費最小的生成樹稱為G的最小
貪心演算法(Greedy Algorithm)之最小生成樹 克魯斯卡爾演算法(Kruskal's algorithm)
克魯斯卡爾演算法(Kruskal's algorithm)是兩個經典的最小生成樹演算法的較為簡單理解的一個。這裡面充分體現了貪心演算法的精髓。大致的流程可以用一個圖來表示。這裡的圖的選擇借用了Wikipedia上的那個。非常清晰且直觀。 首先第一步,我們有一張圖,有若干點和
演算法之最小生成樹
1. 問題描述:利用貪心演算法設計策略構造一個無向連通帶權圖的最小生成樹。 最小生成樹:設G=(V,E)是無向連通帶權圖,即一個網路。E中每條邊(v,w)的權為c[v][w]。包含G所有頂點的樹且該生成樹各邊權的總和最小(即耗費最小),則稱該生成樹為G的最小生成樹。 設G=(V,E)是
圖之最小生成樹 Kruskal演算法 Prim演算法
一.實際問題 最小生成樹一般應用在網(帶權的圖)問題中,實際問題一般比如: 假設要在n個城市間建立通訊聯絡網,則聯通n個城市只需要n-1條線路,但是每兩個城市間都可以建設路線,而且城市與城市間建設代價是不同的,這就需要我們考慮一種經濟的聯絡方式。 將問
貪心法--最小生成樹的Prim演算法和Kruskal演算法
一,貪心法和分治法,DP法的本質不通在於: 只選擇一個子問題求解 二,貪心法的特點: ①,快 ②不能保證得到最優解 三,貪心法的關鍵是:分解方案和貪心選擇方案 以最小生成樹為例進行說明: P