数据结构图的综合实验代码
来源:互联网 发布:仿windows桌面 编辑:程序博客网 时间:2024/04/28 19:46
实验指导书(也就是实验题目)在这里:
http://lab.xcoder.in/xdisk/file-7.html
第15、16的代码(先贴代码,再解析。)
- #include <iostream>
- #include <cstring>
- using namespace std;
- #define MAXV 50
- #define INF 2147483647
- #define MIN(a, b) ((a < b && -1 != a) ? a : b)
- #define MAX(a, b) ((a > b && -1 != b) ? a : b)
- struct Graph {
- int dis[MAXV][MAXV];
- int e, v;
- };
- struct Cost {
- int num, cost;
- };
- const Graph G = {
- {
- { 0, 5, 8, 7, -1, 3 },
- { 5, 0, 4, -1, -1, -1 },
- { 8, 4, 0, 5, -1, 9 },
- { 7, -1, 5, 0, 5, 6 },
- { -1, -1, -1, 5, 0, 1 },
- { 3, -1, 9, 6, 1, 0 }
- },
- 20,
- 6
- };
- Graph NewG;
- /** 输出矩阵 */
- void OutputMatrix(const Graph G)
- {
- printf("输出矩阵:/n");
- for(int i = 0; i < G.v; i++)
- {
- for(int j = 0; j < G.v; j++)
- printf("%4d", G.dis[i][j]);
- printf("/n");
- }
- }
- /** 普利姆算法函数 */
- int Prim(Graph G, int v)
- {
- Cost lowcost[MAXV];
- int min;
- int i, j, k;
- int ans = 0;
- /** 初始化 */
- for(i = 0; i < G.v; i++)
- {
- lowcost[i].cost = G.dis[v][i];
- lowcost[i].num = v;
- }
- printf("根结点为%d./n", v);
- /** 开始Prim循环 */
- for(i = 0; i < G.v - 1; i++)
- {
- min = INF; ///< 设定min初始值为正无穷
- k = -1; ///< 设定min所对应的下标k初始值为-1
- for(j = 0; j < G.v; j++) ///< 循环寻找剩下结点到这棵树的最小权值
- {
- if(lowcost[j].cost > 0 && lowcost[j].cost < min)
- {
- min = lowcost[j].cost;
- k = j;
- }
- }
- /** 加入新结点 */
- printf("加入结点%d, 父结点为%d, 权值为%d./n", k, lowcost[k].num, lowcost[k].cost);
- ans += lowcost[k].cost;
- lowcost[k].cost = 0;
- /** 循环更新剩下各结点到新树的距离 */
- for(j = 0; j < G.v; j++)
- {
- if(G.dis[j][k] && lowcost[j].cost
- && ((-1 != G.dis[j][k] && lowcost[j].cost > G.dis[j][k])
- || -1 == lowcost[j].cost))
- {
- lowcost[j].cost = G.dis[j][k];
- lowcost[j].num = k;
- }
- }
- }
- return ans;
- }
- void Floyd(Graph G)
- {
- int dis[MAXV][MAXV], maxd[MAXV], tot[MAXV], minc = 0, mint = 0;
- memcpy(dis, G.dis, sizeof(dis));
- memset(maxd, 0, sizeof(maxd));
- memset(tot, 0, sizeof(tot));
- int i, j, k;
- /** 弗洛伊德求各结点到其它各结点的最短路 */
- for(i = 0; i < G.v; i++)
- for(j = 0; j < G.v; j++)
- for(k = 0; k < G.v; k++)
- if(i != j && i != k && j != k && -1 != dis[i][k] && -1 != dis[k][j])
- dis[i][j] = MIN(dis[i][j], dis[i][k] + dis[k][j]);
- /** 求答案 */
- for(i = 0; i < G.v; i++)
- {
- for(j = 0; j < G.v; j++)
- if(i != j)
- {
- maxd[i] = MAX(maxd[i], dis[i][j]);
- if(-1 != dis[i][j] && INF != tot[i]) tot[i] += dis[i][j];
- else tot[i] = INF;
- }
- //printf("maxd[%d] = %d;/n", i, maxd[i]);
- //printf("tot[%d] = %d;/n", i, tot[i]);
- if(maxd[i] < maxd[minc]) minc = i;
- if(tot[i] < tot[mint]) mint = i;
- }
- printf("将医院建在结点%d时, 使最远村庄到医院的距离最近, 距离为%d./n", minc, maxd[minc]);
- printf("将医院建在结点%d时, 是总距离最近, 距离为%d./n", mint, tot[mint]);
- }
- int main()
- {
- OutputMatrix(G);
- printf("/n");
- NewG = G;
- printf("开始最小生成树:/n");
- printf("最小生成树权值为: %d./n", Prim(NewG, 0));
- printf("/n");
- NewG = G;
- printf("开始求最短路径:/n");
- Floyd(NewG);
- return 0;
- }
- 数据结构图的综合实验代码
- 数据结构图的应用
- 数据结构图的定义
- 数据结构图的各种操作
- OSPFv2的综合实验试题
- 算法——数据结构图的最短路径实现JAVA代码
- 数据结构图
- 数据结构图
- OpenStack 之 nova-api 的代码结构图
- OpenStack 之 Nova Compute 的代码结构图
- 数据结构图的常用算法总结
- C++数据结构图的深度遍历
- 数据结构图的运算(深度优先)
- 数据结构图和图的基本操作
- 数据结构图的存储于遍历
- 路由器和交换机的综合实验(1)
- 路由器和交换机的综合实验⑵
- 图的综合实验(Dijkstra算法)
- 299 - Train Swapping - Uva online
- JDK动态代理
- 测试
- 新来的,大家帮下忙哦
- 第4讲 文本编辑器Vim/Vi 视频下载地址
- 数据结构图的综合实验代码
- 只需简单几步,使eclipse和java-docs-api中文文档无缝连接
- 心情不好
- jQuery弹出层插件大全
- java mail Test
- bat文件备份MySQL数据库
- 科学难以解释的10大灵异神秘现象?(转载)
- 百度 vs Google:优秀与伟大之别
- 呵呵