最小生成樹 Kruskal演算法

2021-08-01 08:42:23 字數 1871 閱讀 9561

//  gramtx-minspantree.h

#pragma once

#include

#include

#include

#include

using

namespace

std;

#define default_vertices_size 10

//#define t char

//#define e int //權值型別

#define max_cost 0x7fffff

template

< class t,class e>

class graphmtx

edge=new e*[maxvertices]; //開闢陣列空間

for(int i=0;inew e[maxvertices];

}for(int i=0;ifor(int j=0;jif(i==j)

else}}

numvertices=numedges=0; //初始化乙個空圖

}public:

bool insertvertex(t v) //插入頂點

bool insertedge(t vertex1,t vertex2,e cost ) //插入邊

void showgraph()const

//顯示

else

} cout

//獲取頂點所在位置

return -1;

}public:

int getweight(const

int v1,const

int v2) //獲得權值

/*kruskal演算法--從邊的方面考慮構建一顆mst:

先找到一條權值最小的邊,再選擇另外一條權值最小的邊,

但是前提是不能構成環形結構,即這兩條邊不連通。

*/public:

typedef

struct edge

edges;

void minspantree_kruskal( )

}} for(i=0;i//對邊的權值大小進行排序

}} for( i=0;icout

<"-->"

<" "

<<"--------------------"

int[n];

assert(father!=null);

for( i=0;i//自己的父節點就是自己

} for(i=0;iif(!is_same(father,edge[i].begin,edge[i].end)) //判斷是否屬於同乙個集合

while(father[j]!=j)

return i==j; //不相同則說明不是同乙個集合

} void mark_same(int *father,int i,int j)

while(father[j]!=j)

father[j]=i;

}public:

int numberofvertex()const

//返回當前頂點的個數

int numberofedge()const

//返回當前邊數

private:

int maxvertices; //最大頂點個數

int numvertices; //當前頂點個數

int numedges; //當前邊的個數

t *verticeslist; //頂點的儲存空間

e **edge; //邊的儲存空間

};// test,cpp

#include"gramtx-minspantree.h"

void main()

最小生成樹 kruskal(演算法)

最小生成樹 圖中有好多點呀 n個 讓我們找到n 1條邊,來把他們連上吧,但是要讓這n 1條邊的和最小。kruskal演算法 把所有邊由公升序排列,然後從最小的一條邊找起,如果這條邊的兩點不屬於乙個集合 此處運用並查集 那麼就要這條邊,否則,忽略這條邊吧 一直這樣找下去,直到找了n 1條邊為止,此時,...

最小生成樹 Kruskal演算法

1.概覽 kruskal演算法是一種用來尋找最小生成樹的演算法,由joseph kruskal在1956年發表。用來解決同樣問題的還有prim演算法和boruvka演算法等。三種演算法都是貪婪演算法的應用。和boruvka演算法不同的地方是,kruskal演算法在圖中存在相同權值的邊時也有效。2.演...

最小生成樹 kruskal演算法

2016.12.30 演算法思想 先將邊按照權值排序,從權值最小的邊開始列舉,如果當前邊連線的兩個點不屬於同一集合,就將這兩個點連起來 用到的資料結構是並查集 一直到列舉完所有的邊,此時生成的就是最小生成樹 include include include include using namespac...