最小生成樹 模板

2021-10-08 15:17:33 字數 3108 閱讀 8501

學習於:

第一行輸入m、n,代表m個城市,n條路線;

隨後n行,每行輸出a、b、c,代表a到b的距離為c;

輸出把這些城市連線起來需要的最短距離,並輸出路徑。

6 10 

1 2 6

1 3 1

1 4 5

2 3 5

2 5 3

3 4 5

3 5 6

3 6 4

4 6 2

5 6 6

#include #include #include #include using namespace std;

const int inf = 0x3f3f3f3f;

int m, n, map[100][100];

struct mst

mst[100];

int prim()

mst[1].start = 0;

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

}sum += mincost;

cout << 'v' << mst[mind].start << " -> "<< 'v' << mind << endl;

mst[mind].lowestcost = 0;

for (int j = 2; j <= m; j++)}}

return sum;

}int main()

int cost = prim();

cout << cost << endl;

//system("pause");

return 0;

}

輸出:

v1 -> v3

v3 -> v6

v6 -> v4

v3 -> v2

v2 -> v5

15符合正確答案:

學習於:

第一行輸入m、n,代表m個城市,n條路線;

隨後n行,每行輸出a、b、c,代表a到b的距離為c;

輸出把這些城市連線起來需要的最短距離,並輸出路徑。

6 10

1 2 10

1 3 16

1 4 14

2 4 15

2 5 24

3 4 14

3 6 16

4 5 23

4 6 8

5 6 22

#include #include #include #include using namespace std;

const int inf = 0x3f3f3f3f;

int m, n, father[100];

struct mst

edge[100];

int find(int x)

while (x != r)

return r;

}void union(int x, int y)

int kruskal()

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

}return sum;

}int main()

int cost = kruskal();

cout << cost << endl;

//system("pause");

return 0;

}

輸出:

v4 -> v6

v1 -> v2

v1 -> v4

v3 -> v4

v5 -> v6

68符合正確答案:

總結於:

prim演算法和kruskal演算法都能從連通圖找出最小生成樹。

一、prim演算法:

首先以乙個結點作為最小生成樹的初始結點,然後以迭代的方式找出與最小生成樹中各結點權重最小邊,並加入到最小生成樹中。加入之後如果產生迴路則跳過這條邊,選擇下乙個結點。當所有結點都加入到最小生成樹中之後,就找出了連通圖中的最小生成樹了。

二、kruskal演算法:

kruskal演算法與prim演算法的不同之處在於,kruskal在找最小生成樹結點之前,需要對所有權重邊做從小到大排序。將排序好的權重邊依次加入到最小生成樹中,如果加入時產生迴路就跳過這條邊,加入下一條邊。當所有結點都加入到最小生成樹中之後,就找出了最小生成樹。

總的來說,prim和kruskal演算法其實是互通的,區別在於prim是從點開始找到最小的那棵樹,而kruskal是從邊開始找最小的那棵樹。

無疑,kruskal演算法在效率上要比prim演算法快,因為kruskal只需要對權重邊做一次排序,而prim演算法則需要做多次排序。

邊數較少可以用kruskal,因為kruskal演算法每次查詢最短的邊。 邊數較多可以用prim,因為它是每次加乙個頂點,對邊數多的適用。

稠密圖——prim

稀疏圖——kruskal

還有一點就是,在用prim做的題中每兩個地點是只有一條路的,而kruskal不管是多少條路都適用

最小生成樹模板

prim演算法理解可以參考部落格 prim演算法模板 int prime int v int i,j,sum 0,min,k sum是權重和 for i 1 i n i lowcost i 表明當前狀態下在u內距離v點 s中各點 距離的最小值,每個u中點s 中點 都計算 lowcost i map ...

最小生成樹 模板

const int maxn 1010 const int maxm 200020 struct edge edges maxm int father maxn int find int x int cmp edge a,edge b 將邊按權值排序 int kruskal int n,int m ...

模板 最小生成樹

題目描述 如題,給出乙個無向圖,求出最小生成樹,如果該圖不連通,則輸出orz 輸入輸出格式 輸入格式 第一行包含兩個整數n m,表示該圖共有n個結點和m條無向邊。n 5000,m 200000 接下來m行每行包含三個整數xi yi zi,表示有一條長度為zi的無向邊連線結點xi yi 輸出格式 輸出...