1. 程式人生 > >kruskal演算法的c++實現

kruskal演算法的c++實現

kruskal 演算法的思想是將圖中所有的頂點,都看作不同的連通分支,也就是他們每一個都是一個樹。之後,從所有邊中選權重最小的邊,每次判斷該邊的兩個頂點是否屬於不同的連通分支,如果不屬於,將此邊加入,並修改兩個頂點為一個連通分支 ; 若屬於則繼續選下一個權重最小的邊進行上述判斷,直到選中的邊的個數等於N-1(N為頂點個數),演算法結束,此時所有選中的邊和所有的點為原圖的最小生成樹。

c++ 實現如下:

#include <iostream> #include <algorithm> #include <cstdio> #include <vector>
#include <unordered_map>
struct edges{ edges(int s , int d , int w):source(s),dist(d),weight(w){} int source; int dist; int weight; };
bool comp(edges &a , edges &b){ return a.weight < b.weight; }
int main(){
std::vector<edges> edge_array; int graph[][6] = { {0,1,4,0,0,0}, {1,0,1,0
,4,0}, {4,1,0,3,0,0}, {0,0,3,0,4,5}, {0,4,0,4,0,0}, {0,0,0,5,0,0} };
std::unordered_map<int,int> vTree; for(int i = 0 ; i < 6 ; i++){ vTree.insert(std::make_pair(i,i)); }
for(int i = 0 ; i < 6 ; i++){ for(int j = i+1 ; j < 6 ; j++){ if(graph[i][j] != 0){ edge_array.push_back(edges(i,j,graph[i][j])); edge_array.push_back
(edges(j,i,graph[i][j])); } } }
std::sort(edge_array.begin(),edge_array.end(),comp);
//krusal algorithm begin int weight_sum = 0; int i = 0; for(auto iter = edge_array.begin(); iter != edge_array.end() ; iter++){ if(i >= 5){ break; }else{ if( vTree.find(iter->source)->second == vTree.find(iter->dist)->second ){ continue; }else{ i++; weight_sum += iter->weight; if(iter->source < iter->dist){ vTree.find(iter->dist)->second = vTree.find(iter->source)->second; }else{ vTree.find(iter->source)->second = vTree.find(iter->dist)->second; } std::cout << "edge: " << iter->source << " -> " << iter->dist << " = " << iter->weight << std::endl; } } } std::cout << "the MST result is : " << weight_sum << std::endl;
return 0; }