利姆(prime)演算法(只與頂點相關)
演算法描述:
普利姆演算法求最小生成樹時候,和邊數無關,只和定點的數量相關,所以適合求稠密網的最小生成樹,時間複雜度為o(n*n)。
演算法過程:
1.將乙個圖的頂點分為兩部分,一部分是最小生成樹中的結點(a集合),另一部分是未處理的結點(b集合)。
2.首先選擇乙個結點,將這個結點加入a中,然後,對集合a中的頂點遍歷,找出a中頂點關聯的邊權值最小的那個(設為v),將此頂點從b中刪除,加入集合a中。
3.遞迴重複步驟2,直到b集合中的結點為空,結束此過程。
4.a集合中的結點就是由prime演算法得到的最小生成樹的結點,依照步驟2的結點連線這些頂點,得到的就是這個圖的最小生成樹。
演算法實現具體過程:
1.將第乙個點放入最小生成樹的集合中(標記visit[i]=1意思就是最小生成樹集合)。
2.從第二個點開始,初始化lowcost[i]為跟1點相連(僅僅相連)的邊的權值(lowcost[i]不是這個點的最小權值!在以後會逐步更新)。
3.找最小權值的邊。
從第二點開始遍歷,如果不是最小生成樹的集合的點,則找出從2到n的最小權值(lowcost[j])。
4.將找出來的最小權值的邊的頂點加入最小生成樹的集合中(標記visit[i] = 1),權值想加。
5.更新lowcost[j]集合。
假設第一次:lowcost[2]代表與1相連的點的權值,現在加入了k點。則比較k點與2點的邊map[k][2]和lowcost[2]的大小,若lowcost[2]大,則lowcost[2] = map[k][2]。(關鍵步驟:實質就是每在最小生成樹集合中加入乙個點就需要把這個點與集合外的點比較,不斷的尋找兩個集合之間最小的邊)
6.迴圈上述步驟,指導將全部頂點加入到最小生成樹集合為止
#include#include#include#include#includeusing namespace std;
#define inf 0x3f3f3f3f
#define maxn 110
int map[maxn][maxn], lowcost[maxn];
bool visit[maxn];
int nodenum, sum;
void prim()
}int main()
prim();
printf("%d\n", sum); //最小生成樹權值之和
} return 0;
}
克魯斯卡爾(kruskal)演算法(只與邊相關)
演算法描述:克魯斯卡爾演算法需要對圖的邊進行訪問,所以克魯斯卡爾演算法的時間複雜度只和邊又關係,可以證明其時間複雜度為o(eloge)。
演算法過程:
1.將圖各邊按照權值進行排序
2.將圖遍歷一次,找出權值最小的邊,(條件:此次找出的邊不能和已加入最小生成樹集合的邊構成環),若符合條件,則加入最小生成樹的集合中。不符合條件則繼續遍歷圖,尋找下乙個最小權值的邊。
3.遞迴重複步驟1,直到找出n-1條邊為止(設圖有n個結點,則最小生成樹的邊數應為n-1條),演算法結束。得到的就是此圖的最小生成樹。
克魯斯卡爾(kruskal)演算法因為只與邊相關,則適合求稀疏圖的最小生成樹。而prime演算法因為只與頂點有關,所以適合求稠密圖的最小生成樹。
#include
#include
#include
#include
#include
using namespace std;
#define max 1000
int father[max], son[max];
int v, l;
typedef struct kruskal //儲存邊的資訊
;bool cmp(const kruskal & a, const kruskal & b)
int unionsearch(int x) //查詢根結點+路徑壓縮
bool join(int x, int y) //合併
else
return true;
}int main()
for(int i = 1; i <= l ; ++i)
sort(edge + 1, edge + 1 + l, cmp); //按權值由小到大排序
for(int i = 1; i <= l; ++i)
if(ltotal == v - 1) //最小生成樹條件:邊數=頂點數-1
}if(flag) printf("%d\n", sum);
else printf("data error.\n");
}return 0;
}
Prim演算法和Kruskal演算法
一 prim演算法 prim演算法實現的是找出乙個有權重連通圖中的最小生成樹,即 具有最小權重且連線到所有結點的樹。強調的是樹,樹是沒有迴路的 prim演算法是這樣來做的 首先以乙個結點作為最小生成樹的初始結點,然後以迭代的方式找出與最小生成樹中各結點權重最小邊,並加入到最小生成樹中。加入之後如果產...
Prim演算法和Kruskal演算法
現有村落間道路的統計資料表中,列出了有可能建設成標準公路的若干條道路的成本,求使每個村落都有公路連通所需要的最低成本。輸入資料報括城鎮數目正整數n 1000 和候選道路數目m 3n 隨後的m行對應m條道路,每行給出3個正整數,分別是該條道路直接連通的兩個城鎮的編號以及該道路改建的預算成本。為簡單起見...
Prim演算法和Kruskal演算法介紹
一 prim演算法 普利姆 prim 演算法適用於求解無向圖中的最小生成樹 minimum cost spanning tree 下面是prim演算法構造最小生成樹的過程 選擇乙個節點開始,比如v1進入集合u,剩下的集合的v u包括剩下的節點,然後尋找從集合u到集合v u最近的路徑。這裡有三條路徑分...