圖論---cruskal算法(未完成)

由於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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章