普利姆演算法的測試資料如下:每行資料表示邊的兩個端點和權值
10 13
1 0 4
2 1 2
3 0 3
4 3 8
5 1 2
5 2 2
5 4 1
6 3 10
7 4 4
8 5 4
8 7 6
9 6 5
9 7 2
普利姆最小生成樹演算法:
/*
描述:普利姆演算法求解最小生成樹
*/#include
#include
#include
#include
#include
#include
#define inf int_max
#define fileinput 1
using
namespace
std;
typedef
struct edgenode
edgenode;
void creatmatrix(int **adjmatrix,int n,int e); //構建無向圖的鄰接矩陣
void printmatrix(int **adjmatrix,int n); //輸出圖的鄰接矩陣
void initedgeset(int **adjmatrix,edgenode *edgeset,int n,int start); //初始化邊集
int chooseedge(edgenode *edgeset,int n,int index); //從候選邊集中選取權重最小的邊
void modfiyedgeset(int **adjmatrix,edgenode *edgeset,int n,int index,int to);//調整候選邊集
void primmst(int **adjmatrix,edgenode *edgeset,int n,int start); //普利姆演算法
void printmst(edgenode *edgeset,int n); //輸出最小生成樹選舉結果
int main()
#if fileinput //條件編譯:輸入重定向到鍵盤(輸入普利姆演算法的起始頂點)
fin.close();
#endif
return0;}
void creatmatrix(int **adjmatrix,int n,int e)
}void printmatrix(int **adjmatrix,int n)
}int chooseedge(edgenode *edgeset,int n,int index)
return minpos;
}void modfiyedgeset(int **adjmatrix,edgenode *edgeset,int n,int index,int to)
}void printmst(edgenode *edgeset,int n)
edgenode;
bool
operator
<(const edgenode &a,const edgenode &b)
void creatmatrix(int **adjmatrix,edgenode *edgeset,int n,int e)
}void printmatrix(int **adjmatrix,int n)
return root;
}int mergeedge(int nodefrom,int nodeto) //邊結點合併到連通圖中
void kruskalmst(edgenode *edgeset,int n,int e)
if(countedge==n-1)
}if(indexcout
<<"mincost: "
}
無向最小生成樹(prim 與krusckal)總結
之前學的時候一直感覺是兩個演算法沒什麼區別,今天總結一下 大體思路 prim演算法是做n次確定每乙個點,使其構成最小生成樹。而相對比的是krusckal演算法是做n 1次,找到n 1條最短邊,以此來確定n個點。假設給定n個點,以及m條邊,既然是無向的,且有可能使其連通,那麼邊數m必定是 n 1 m ...
演算法導論 第23章 最小生成樹
最小生成樹 minimum spanning tree 全稱 最小權值生成樹 在含有n個頂點的連通圖中選擇n 1條邊,構成一棵極小連通子圖,並使該連通子圖中n 1條邊上權值之和達到最小,則稱其為連通網的最小生成樹。有兩種具體的實現演算法 kruskal演算法 prim演算法 兩者都用到了貪心演算法。...
最小生成樹(演算法導論第23章)
下面討論的兩種最小生成樹演算法都是貪心演算法。貪心演算法的每一步必須在多個可能的選擇中選擇一種,貪心演算法選擇在當前看來最好的選擇。通用演算法是每個時刻生長最小生成樹的一條邊 安全邊 並在整個策略的實施過程中,管理乙個遵守下述迴圈不變式的邊集合a 在每遍迴圈之前,a是某棵最小生成樹的子集。gener...