动态规划算法计算网络的最长路线和最短路线
2016-03-16 22:47
267 查看
/* * File: longest.c * Desciption: 动态规划算法计算网络的最长路线和最短路线 * Created: 2001/12/2 * Author: Justin Hou [mailto:justin_hou@hotmail.com] * */ #include <stdio.h> #define N 7 /* 顶点数目 */ #define I 999 /* 表示无穷大 */ int graph = { /* 图的邻接矩阵 */ {I, 4, 5, 8, I, I, I}, {I, I, I, 6, 6, I, I}, {I, I, I, 5, I, 7, I}, {I, I, I, I, 8, 9, 9}, {I, I, I, I, I, I, 5}, {I, I, I, I, I, I, 4}, {I, I, I, I, I, I, I} }; int List ; /* 存放拓扑序列 */ int TopologicalOrder(); /* 拓扑排序函数 */ void main() /* 主 函 数 */ { int i, j, k, l; int ee , el ; /* 最长最短距离 */ int path_e , path_l , n_e , n_l ; /* 记录路径数据 */ /* 初始化数据 */ for (i = 0; i < N; i++) { n_e[i] = 0; /* 到 i 的最短路线的结点数 */ n_l[i] = 0; /* 到 i 的最长路线的结点数 */ ee[i] = I; el[i] = 0; } ee[0] = el[0] = 0; /* 初始化头结点 */ path_e[0][0] = 0; path_l[0][0] = 0; n_e[0] = 1; n_l[0] = 1; /* 拓扑排序 */ if (!TopologicalOrder()) return; /* 对于拓扑序列,运用动态规划步步算出最长路线与最短路线 */ for (i = 0; i < N; i++) { /* 提取拓扑序列的元素 */ k = List[i]; /* 更新它所指向顶点的所有数据 */ for (j = 0; j < N; j++) { /* 寻找指向的顶点 */ if (graph[k][j] != I) { /* 如果新路径更短 */ if (graph[k][j] + ee[k] < ee[j]) { /* 更新最短路径长度 */ ee[j] = graph[k][j] + ee[k]; /* 更新最短路线 */ for (l = 0; l < n_e[k]; l++) { path_e[j][l] = path_e[k][l]; } path_e[j][l] = j; n_e[j] = l + 1; } /* 如果新路径更长 */ if (graph[k][j] + el[k] > el[j]) { /* 更新最长路径长度 */ el[j] = graph[k][j] + el[k]; /* 更新最长路线 */ for (l = 0; l < n_l[k]; l++) { path_l[j][l] = path_l[k][l]; } path_l[j][l] = j; n_l[j] = l + 1; } } } } /* 输出结果到屏幕 */ for (i = 0; i < N; i++) { printf("shortest(%d): %2d Path: ", i + 1, ee[i]); for (j = 0; j < n_e[i]; j++) { printf("%d ", path_e[i][j] + 1); } printf("\n"); printf("longest (%d): %2d Path: ", i + 1, el[i]); for (j = 0; j < n_l[i]; j++) { printf("%d ", path_l[i][j] + 1); } printf("\n"); } } int TopologicalOrder() { int i, j, top, count; int indegree , Stack ; top = 0; /* 栈顶标志 */ for (i = 0; i < N; i++) { indegree[i] = 0; /* 初始化入度 */ for (j = 0; j < N; j++) { if (graph[j][i] != I) { /* 如连通 */ indegree[i]++; /* 入度自增1 */ } } if (!indegree[i]){ /* 如入度为零 */ Stack[top++] = i; /* 入栈 */ } } count = 0; /* 输出顶点数 */ while (top != 0) { i = Stack[--top]; List[count++] = i; for (j = 0; j < N; j++) { if (graph[i][j] != I) { /* 如连通 */ if (!(--indegree[j])) { /* 而且入度为零 */ Stack[top++] = j; /* 入栈 */ } } }/* for */ }/* while */ return (count < N) ? 0 : 1; }
运行结果:
相关文章推荐
- 动态规划算法计算网络的最长路线和最短路线
- 网络最短路径Dijkstra算法
- 网络最短路径Dijkstra算法
- 网络最短路径Dijkstra算法
- 操作系统-收藏网络博客
- Tensorflow实现卷积神经网络,用于人脸关键点识别
- Window10 下 VMware 10 安装 CentOS 7 连接网络
- QT---基于WinPcap的局域网络管理工具(主机扫描、包过滤、ARP攻击、端口扫描)
- 网络性能评价的实现
- DNS使用的是TCP协议还是UDP协议
- [android] 网络图片查看器
- Hudson (Jenkins) and Git HTTP authentication | Views From The Hill
- Android HTTPS SSL双向验证
- win8无线网络不稳定怎么办?win8无线网络不稳定解决方法
- [网络流24题][CODEVS1915]分配问题(网络流)
- [网络流24题][CODEVS1914]运输问题(费用流)
- https和http的区别详解
- 卷积神经网络改进想法初探(上篇)
- Android开发之网络通讯详解
- cisco 网络上设备配置NTP