1. 程式人生 > >最小生成樹 kruskal演算法 C++實現

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

#include <iostream>
#include <vector>
#include <algorithm>
#define Inf 0x7fffffff
using namespace std;
struct node
{
    int u,v;
    int w;
    node(int a,int b,int x):u(a),v(b),w(x){}
};
vector<node> edge;
int vn,an;
int pa[1000];
bool cmp(const node &a,const node &b)
{
    return
a.w<b.w; } int find(int x) { return x==pa[x]?x:pa[x]=find(pa[x]); } int kruskal() { int sumw=0,cnt=0; for(int i=1;i<=vn;++i) pa[i]=i; for(int i=0;i<an;++i) { int x=find(edge[i].u),y=find(edge[i].v); if(x!=y) { pa[x]=y; sumw+=edge[i].w; ++cnt; } if
(cnt==vn-1) break; } return sumw; } int main() { cin>>vn>>an; for(int i=0;i<an;++i) { int a,b,x; cin>>a>>b>>x; edge.push_back(node(a,b,x)); } sort(edge.begin(),edge.end(),cmp); cout<<kruskal(); return 0; }

相關推薦

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

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

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

#include <iostream> #include <vector> #define Inf 0x7fffffff using namespace std; int mai

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

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

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

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

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

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

圖的小生成樹Kruskal演算法

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

小生成樹 - Kruskal演算法

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

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

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

小生成樹Prim演算法java實現

package prim; import java.util.*; public class PrimTest { public static void main(String[] args) { //互動輸入圖的鄰接矩陣表示,為方便測試,直接給定了鄰接矩陣值 // System

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

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

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

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

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

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

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演算法總結

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

小生成樹 Kruskal演算法

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

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

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

小生成樹-kruskal演算法

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