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

貪心演算法基礎之最小生成樹 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