學習於:第一行輸入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 輸出格式 輸出...