最小生成树的示例程序.txt
上传用户:bjzyl2008
上传日期:2013-01-16
资源大小:1k
文件大小:3k
源码类别:

数据结构

开发平台:

Visual C++

  1. #include<iostream> 
  2. using namespace std; 
  3. // 用结构表示边 
  4. struct  Edge { 
  5.     char vexa;        // 边的起点 
  6.     char vexb;        // 边的终点 
  7.     int weight;        // 边的权植 
  8. }; 
  9. // 初始化图 
  10.     Edge e[18] = { {'a','b',2}, {'b','c',1} ,{'c','d',2},{'d','e',9}, 
  11.                 {'e','f',4},{'f','g',1},{'g','h',9},{'h','a',1}, 
  12.                 {'a','i',8},{'b','i',6},{'c','j',3},{'d','k',7},                            {'e','k',2},{'f','k',1},{'g','j',4},{'h','i',7}, 
  13. {'i','j',1},{'j','k',6}}; 
  14. // w函数返回起点序号为x,终点序号为y的边的权植。如果没有这条边就返回无穷大 
  15. int w( int x, int y) 
  16.     char from = x + 97; 
  17.     char to = y + 97; 
  18.     for (int i = 0; i < 18; i++) { 
  19.         if (e[i].vexa == from && e[i].vexb == to) { 
  20.             return e[i].weight; 
  21.         } 
  22.         if (e[i].vexa == to && e[i].vexb == from) { 
  23.             return e[i].weight; 
  24.         } 
  25.     } 
  26.     return 1000;            // 用1000代表无穷大,如果图中没有这条边就返回无穷大 
  27. int main() 
  28.     Edge e_mst[10];            // 表示已经加入最小生成树的边 
  29. // 表示已经加入最小生成树(mst)的结点, 数组元素从0到10分别对应结点a到j 
  30. // 如果vex_mst[i]=0,表示对应结点没有加入到mst 
  31. // 如果vex_mst[i]=1,表示对应结点已经加入到mst 
  32. int vex_mst[11];             
  33.                          
  34.     for (int i = 0; i < 11; i++)    // 初始化 
  35.         vex_mst[i] = 0; 
  36.     vex_mst[0] = 1;            // 设置初始结点为a 
  37.     // 将10条边加入到最小生成树 
  38.     for (int i = 0; i < 10; i++) { 
  39.         // 加入一条边。 
  40. // 这条边的两个结点一个在mst中,而另一个不在mst中而且具有最小权植 
  41.         int add_vex;                    // 选中的结点 
  42.         int min_weight = 1000;            // 最小权植,初始值为1000 
  43.         Edge adde; 
  44.         for (int j = 0; j < 11; j++) 
  45.             if (vex_mst[j] == 1) {            // j是mst中的结点 
  46.                 for (int k = 0; k < 11; k++) { 
  47.                     if (vex_mst[k] == 0 && w(j, k) < min_weight ) { 
  48.                         add_vex = k; 
  49.                         min_weight = w(j, k); 
  50.                         adde.vexa = j + 97; 
  51.                         adde.vexb = k + 97; 
  52.                         adde.weight = min_weight; 
  53.                     } 
  54.                 } 
  55.             } 
  56.         vex_mst[add_vex] = 1;                //将选择的结点加入mst 
  57.         char avex = add_vex + 97;            // 将选择的边加入mst 
  58.         cout<<"addvex:"<<avex<<endl; 
  59.         // 输出加入mst的顶点,边,以及边的权植 
  60.         cout<<"addedge:"<<adde.vexa<<"-"<<adde.vexb<<" w:"<<adde.weight<<endl; 
  61.     } 
  62. }