由於cruskal算法的執行過程中需要合併,而致使實現較複雜,下面的算法基本上已有形狀,還剩幾個步驟,先留着,說不定我這個實現不是很好,遇到相關問題了再具體研究
/*-------------------------------------------------------------------
* Purpose:
* 使用cruskal算法求最小生成樹
* 使用圖爲算法導論第二版p344 圖23-1
* Time:
* 2012年3月19日 20:58:28
* Author:
* 張彥升
--------------------------------------------------------------------*/
#include <iostream>
#include <set>
#include <vector>
using namespace std;
#define V 9 /*點的個數*/
const int inf = 0x3f3f3f3f;
int vis[V];
int lowc[V]; /*最低代價*/
/**
* kruskal算法要對所有的邊進行排序,所以需要一個邊表
* 由邊表可以得到邊的兩個頂點的位置,及其權重
*/
struct EdgeTable
{
int u;
int v;
int weight;
EdgeTable(int t_u,int t_v,int t_weight)
:u(u),
v(t_v),
weight(t_weight)
{
return;
}
};
bool operator <(const EdgeTable& left,const EdgeTable& right) const
{
if (left.weight < right.weight)
{
return true;
}
return false;
}
struct TreeSet
{
typedef set<int> SetInt;
SetInt vetexs;
int get_identifer()
{
return vetexs.front();
}
/**
* 若在其中則返回真,若沒有則返回假
*/
bool find_vetex(int v)
{
SetInt::iterator iter = vetexs.find(v);
if (iter != vetexs.end())
{
return true;
}
return false;
}
};
typedef vector<TreeSet> TreeSets;
/**
*
*/
int make_set(int n,TreeSets& tree_sets)
{
for (int i = 0;i < n;i++)
{
tree_sets.push_back(i);
}
return 0;
}
typedef set<EdgeTable,greater<EdgeTable> > Edges;
/**
* 初始化邊表,由遞增順序排列
*/
int init_edge(int cost[][V],int n,Edges &edges)
{
for (int i = 0;i < n;i ++)
{
for (int j = 0;j < n;j ++)
{
int c = cost[i][j];
if (c != inf)
{
edges.insert(EdgeTable(i,j,c));
}
}
}
return 0;
}
/**
* 找到節點v所在的集合
*/
int find_set(TreeSets tree_sets,int u)
{
TreeSets::iterator iter_tree_set = tree_sets.begin();
for (;iter_tree_set != tree_sets.end();++iter_tree_set)
{
bool b_found = iter_tree_set.find_vetex(u);
if (b_found == true)
{
return iter_tree_set.get_identifer();
}
}
return -1;
}
int cruskal(int cost[][V],int n)
{
EdgeTable edges;
TreeSets tree_sets;
init_edge(cost,n,edges);
make_set(n,tree_sets);
EdgeTable::iterator iter_edge = edges.begin();
int id_u = -1;
int id_v = -1;
for (;iter_edge != edges.end();++iter_edge)
{
id_u = find_set(tree_sets,iter_edge.u);
id_v = find_set(tree_sets,iter_edge.v);
if (id_u == -1 || id_v == -1)
{
cout << "在尋找集合的時候不應該出現找不見的情況" << endl;
return -1;
}
else if (id_u != id_v)
{
}
}
return 0;
}
int main()
{
int cost[V][V] = {
/* a b c d e f g h i*/
{inf,4,inf,inf,inf,inf,inf,8,inf},
{4,inf,8,inf,inf,inf,inf,11,inf},
{inf,8,inf,7,inf,4,inf,8,2},
{inf,4,7,inf,9,14,inf,8,inf},
{inf,4,inf,9,inf,10,inf,8,inf},
{inf,inf,4,14,10,inf,2,8,inf},
{inf,inf,inf,inf,inf,2,inf,1,6},
{8,11,inf,inf,inf,inf,1,inf,7},
{inf,inf,2,inf,inf,inf,6,7,inf},
};
int res = cruskal(cost,V);
cout << res << endl;
return 0;
}