lzmagic  
博学 审问 慎思 明辨 笃行
日历
<2009年1月>
28293031123
45678910
11121314151617
18192021222324
25262728293031
1234567
统计
  • 随笔 - 16
  • 文章 - 1
  • 评论 - 5
  • 引用 - 0

导航

常用链接

留言簿

随笔分类(18)

随笔档案(16)

文章档案(1)

最新随笔

搜索

  •  

积分与排名

  • 积分 - 4739
  • 排名 - 367

最新评论

阅读排行榜

评论排行榜

 
  1/* (MST: minimum spanning tree)
  2 * 描述: 设G = (V, E)是无向图,求最小生成树T(U, E')。
  3 *
  4 * MST_Prim算法:
  5 * 从V中任选一结点加到U中;
  6 * 初始化候选集(最小割边集);
  7 * while()
  8 * {
  9 *    从当前候选集中选一条最小边;
 10 *    将所选最小边加入E'中;
 11 *    将所选最小边的在V-U中的结点加入到U;
 12 *    调整候选集;
 13 * }
 14 *
 15 * 数据结构:
 16 * 1.图: 邻接矩阵g[][]
 17 * 2.最小生成树: 三元组TreeEdge(边始点, 边终点, 边权)
 18 * 3.中间数据结构: 候选集Close(邻接点, 最小割边值)
 19 *
 20 * 注: 两结点不相邻用的权值不是INFINITE,而是0,因此任何两结点之间的权值不能为0。
 21 * 
 22 * 作者:lzmagic
 23 */

 24
 25#include<iostream>
 26using namespace std;
 27
 28int const MAX_GRAPH_NODES = 100;
 29
 30struct TreeEdge
 31{
 32    int v1, v2;
 33    double w;
 34}
;
 35
 36struct Close
 37{
 38    int v;
 39    double low;
 40}
;
 41
 42void MST_Prim(double g[][MAX_GRAPH_NODES], int &gn, TreeEdge *mst, int &mstn)
 43{
 44    int i, j, k;
 45    Close *close = new Close[gn];
 46
 47    // 从V中任选一结点加到U中(赋值为-1);
 48    close[0].low = -1;
 49
 50    // 初始化候选集(最小割边集);
 51    for(i = 1; i < gn; i++)
 52        close[i].v = 0, close[i].low = g[0][i];
 53
 54    for(i = 0; i < gn - 1; i++)
 55    {
 56        // 从当前候选集中选一条最小边;
 57        for(k = 1; k < gn; k++)
 58            if(close[k].low != -1
 59                break;
 60        for(j = k + 1; j < gn; j++)
 61            if(close[j].low != -1 && (close[j].low < close[k].low && close[j].low != 0))
 62                k = j;
 63
 64        // 将所选最小边加入E'中;
 65        mst[i].v1 = k, mst[i].v2 = close[k].v, mst[i].w = close[k].low;
 66
 67        // 将所选最小边的在V-U中的结点加入到U(赋值为-1);
 68        close[k].low = -1;
 69
 70        // 调整候选集;
 71        for(j = 1; j < gn; j++)
 72            if(g[j][k] != 0 && (g[j][k] < close[j].low || close[j].low == 0))
 73                close[j].v = k, close[j].low = g[j][k];
 74    }

 75    mstn = i; 
 76
 77    delete []close;
 78}

 79
 80int main()
 81{
 82    double g[MAX_GRAPH_NODES][MAX_GRAPH_NODES];
 83    g[0][0= 0, g[0][1= 7, g[0][2= 0, g[0][3= 5, g[0][4= 0, g[0][5= 0, g[0][6= 0,
 84    g[1][0= 7, g[1][1= 0, g[1][2= 8, g[1][3= 9, g[1][4= 7, g[1][5= 0, g[1][6= 0,
 85    g[2][0= 0, g[2][1= 8, g[2][2= 0, g[2][3= 0, g[2][4= 5, g[2][5= 0, g[2][6= 0,
 86    g[3][0= 5, g[3][1= 9, g[3][2= 0, g[3][3= 0, g[3][4=15, g[3][5= 6, g[3][6= 0,
 87    g[4][0= 0, g[4][1= 7, g[4][2= 5, g[4][3=15, g[4][4= 0, g[4][5= 8, g[4][6= 9,
 88    g[5][0= 0, g[5][1= 0, g[5][2= 0, g[5][3= 6, g[5][4= 8, g[5][5= 0, g[5][6=11,
 89    g[6][0= 0, g[6][1= 0, g[6][2= 0, g[6][3= 0, g[6][4= 9, g[6][5=11, g[6][6= 0;
 90    int gn = 7;
 91    TreeEdge mst[MAX_GRAPH_NODES];
 92    int mstn;
 93
 94    MST_Prim(&g[0], gn, mst, mstn);
 95
 96    for(int i = 0; i < mstn; i++)
 97        cout << mst[i].v1 << '\t' << mst[i].v2 << '\t' << mst[i].w << endl;
 98
 99    return 0;
100}
posted on 2008-05-10 09:38 lzmagic 阅读(1121) 评论(0)  编辑 收藏 引用 所属分类: 图论

标题  
姓名  
主页
验证码 *
内容(提交失败后,可以通过“恢复上次提交”恢复刚刚提交的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
[使用Ctrl+Enter键可以直接提交]

相关链接:
网站导航:
 
Copyright © lzmagic Powered by: 博客园 模板提供:沪江博客