prim演算法,克魯斯卡爾演算法 最小生成樹

2021-08-21 23:35:55 字數 1226 閱讀 6890

最小生成樹的乙個作用,就是求最小花費。要在n個城市之間鋪設光纜,主要目標是要使這 n 個城市的任意兩個之間都可以通訊,但鋪設光纜的費用很高,且各個城市之間鋪設光纜的費用不同,因此另乙個目標是要使鋪設光纜的總費用最低。這就需要找到帶權的最小生成樹。

主要思路:貪心,假設一共有五個點,按道理來講,應該是先找到圖中最小權值的兩個點沒然後對剩餘的點進行遍歷。但是也可以任意指定乙個點。可以任意指定的原因就是,如果給定的資訊可以構成最小生成樹的話,那麼最小生成樹中一定有所有的點,那麼這個點也一定在樹上,所以可以任意指定乙個點進行迴圈。指定第乙個點後,然後尋找其他還沒有訪問的點到該點的最小距離,找到之後,將該點放入已經訪問過的集合中,然後再找剩下的未訪問的點到已經訪問的這一坨中的點的最小距離,然後不停的迴圈這個過程,知道所有的點都訪問為止。(如果是最大生成樹的話,直接改克魯斯卡爾中的sort就可以了,最小生成樹是公升序,最大生成樹就是降序)

例題:**:(prim)

#include#include#include#include#include#include#include#include#include#includeusing namespace std;

# define maxn  1005

# define inf 0x3f3f3f3f

int a[maxn][maxn];

int dis[maxn];

int n,m;

int vis[maxn];

int flag;

int prime()

}}return sum;

}int main()

//自己到自己的距離是0

flag=0;

for(int i=1; i<=m; i++)

}int t=prime();

if(m克魯斯卡爾演算法:

#include#include#include#include#include#include#includeusing namespace std;

# define maxn 10000+10

int n,m;

struct node

edge[maxn];

int father[maxn];

int find(int t)

bool cmp(node t1,node t2)

int t=kruskal();

cout<}

return 0;

}

克魯斯卡爾演算法

測試輸入包含若干測試用例。每個測試用例的第1行給出評估的道路條數 n 村莊數目m 100 隨後的 n 行對應村莊間道路的成本,每行給出一對正整數,分別是兩個村莊的編號,以及此兩村莊間道路的成本 也是正整數 為簡單起見,村莊從1到m編號。當n為0時,全部輸入結束,相應的結果不要輸出。對每個測試用例,在...

克魯斯卡爾演算法

設n v,是連通網 1 令最小生成樹的初始狀態為只有n個頂點而無邊的非連通圖t v,圖中每個頂點自成乙個連通分量 2 在e中選擇代價最小的邊,若該邊依附的頂點落在t中不同的連通分量上,則將此邊加入到t中,否則捨去此邊而選擇下一條代價最小的邊 3 反覆執行第2 步,直至t中所有頂點都在同一連通分量上為...

克魯斯卡爾演算法

via 克魯斯卡爾演算法 在連通網中求出最小生成樹 include include define maxedge 20 define maxvex 20 define infinity 65535 typedef struct mgraph typedef struct edge 對邊集陣列edge...