// 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...