数据结构图的综合实验代码

来源:互联网 发布:仿windows桌面 编辑:程序博客网 时间:2024/04/28 19:46

 实验指导书(也就是实验题目)在这里:

http://lab.xcoder.in/xdisk/file-7.html

第15、16的代码(先贴代码,再解析。)

Code:
  1. #include <iostream>  
  2. #include <cstring>  
  3. using namespace std;  
  4.   
  5. #define MAXV 50  
  6. #define INF 2147483647  
  7. #define MIN(a, b) ((a < b && -1 != a) ? a : b)  
  8. #define MAX(a, b) ((a > b && -1 != b) ? a : b)  
  9.   
  10. struct Graph {  
  11.     int dis[MAXV][MAXV];  
  12.     int e, v;  
  13. };  
  14.   
  15. struct Cost {  
  16.     int num, cost;  
  17. };  
  18.   
  19. const Graph G = {  
  20.     {  
  21.         { 0, 5, 8, 7, -1, 3 },  
  22.         { 5, 0, 4, -1, -1, -1 },  
  23.         { 8, 4, 0, 5, -1, 9 },  
  24.         { 7, -1, 5, 0, 5, 6 },  
  25.         { -1, -1, -1, 5, 0, 1 },  
  26.         { 3, -1, 9, 6, 1, 0 }  
  27.     },  
  28.     20,  
  29.     6  
  30. };  
  31. Graph NewG;  
  32.   
  33. /** 输出矩阵 */  
  34. void OutputMatrix(const Graph G)  
  35. {  
  36.     printf("输出矩阵:/n");  
  37.     for(int i = 0; i < G.v; i++)  
  38.     {  
  39.         for(int j = 0; j < G.v; j++)  
  40.             printf("%4d", G.dis[i][j]);  
  41.         printf("/n");  
  42.     }  
  43. }  
  44.   
  45. /** 普利姆算法函数 */  
  46. int Prim(Graph G, int v)  
  47. {  
  48.     Cost lowcost[MAXV];  
  49.     int min;  
  50.     int i, j, k;  
  51.     int ans = 0;  
  52.   
  53.     /** 初始化 */  
  54.     for(i = 0; i < G.v; i++)  
  55.     {  
  56.         lowcost[i].cost = G.dis[v][i];  
  57.         lowcost[i].num = v;  
  58.     }  
  59.     printf("根结点为%d./n", v);  
  60.   
  61.     /** 开始Prim循环 */  
  62.     for(i = 0; i < G.v - 1; i++)  
  63.     {  
  64.         min = INF;                          ///< 设定min初始值为正无穷  
  65.         k = -1;                             ///< 设定min所对应的下标k初始值为-1  
  66.         for(j = 0; j < G.v; j++)            ///< 循环寻找剩下结点到这棵树的最小权值  
  67.         {  
  68.             if(lowcost[j].cost > 0 && lowcost[j].cost < min)  
  69.             {  
  70.                 min = lowcost[j].cost;  
  71.                 k = j;  
  72.             }  
  73.         }  
  74.   
  75.         /** 加入新结点 */  
  76.         printf("加入结点%d, 父结点为%d, 权值为%d./n", k, lowcost[k].num, lowcost[k].cost);  
  77.         ans += lowcost[k].cost;  
  78.         lowcost[k].cost = 0;  
  79.   
  80.         /** 循环更新剩下各结点到新树的距离 */  
  81.         for(j = 0; j < G.v; j++)  
  82.         {  
  83.             if(G.dis[j][k] && lowcost[j].cost  
  84.                 && ((-1 != G.dis[j][k] && lowcost[j].cost > G.dis[j][k])  
  85.                 || -1 == lowcost[j].cost))  
  86.             {  
  87.                 lowcost[j].cost = G.dis[j][k];  
  88.                 lowcost[j].num = k;  
  89.             }  
  90.         }  
  91.     }  
  92.   
  93.     return ans;  
  94. }  
  95.   
  96. void Floyd(Graph G)  
  97. {  
  98.     int dis[MAXV][MAXV], maxd[MAXV], tot[MAXV], minc = 0, mint = 0;  
  99.     memcpy(dis, G.dis, sizeof(dis));  
  100.     memset(maxd, 0, sizeof(maxd));  
  101.     memset(tot, 0, sizeof(tot));  
  102.     int i, j, k;  
  103.   
  104.     /** 弗洛伊德求各结点到其它各结点的最短路 */  
  105.     for(i = 0; i < G.v; i++)  
  106.         for(j = 0; j < G.v; j++)  
  107.             for(k = 0; k < G.v; k++)  
  108.                 if(i != j && i != k && j != k && -1 != dis[i][k] && -1 != dis[k][j])  
  109.                     dis[i][j] = MIN(dis[i][j], dis[i][k] + dis[k][j]);  
  110.   
  111.     /** 求答案 */  
  112.     for(i = 0; i < G.v; i++)  
  113.     {  
  114.         for(j = 0; j < G.v; j++)  
  115.             if(i != j)   
  116.             {  
  117.                 maxd[i] = MAX(maxd[i], dis[i][j]);  
  118.                 if(-1 != dis[i][j] && INF != tot[i]) tot[i] += dis[i][j];  
  119.                 else tot[i] = INF;  
  120.             }  
  121.           
  122.         //printf("maxd[%d] = %d;/n", i, maxd[i]);  
  123.         //printf("tot[%d] = %d;/n", i, tot[i]);  
  124.         if(maxd[i] < maxd[minc]) minc = i;  
  125.         if(tot[i] < tot[mint]) mint = i;  
  126.     }  
  127.   
  128.     printf("将医院建在结点%d时, 使最远村庄到医院的距离最近, 距离为%d./n", minc, maxd[minc]);  
  129.     printf("将医院建在结点%d时, 是总距离最近, 距离为%d./n", mint, tot[mint]);  
  130. }  
  131.   
  132. int main()  
  133. {  
  134.     OutputMatrix(G);  
  135.   
  136.     printf("/n");  
  137.   
  138.     NewG = G;  
  139.     printf("开始最小生成树:/n");  
  140.     printf("最小生成树权值为: %d./n", Prim(NewG, 0));  
  141.   
  142.     printf("/n");  
  143.   
  144.     NewG = G;  
  145.     printf("开始求最短路径:/n");  
  146.     Floyd(NewG);  
  147.   
  148.     return 0;  
  149. }  

 

原创粉丝点击