动态规划算法计算网络的最长路线和最短路线

/*
* 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[N][N] = {                                        /* 图的邻接矩阵 */
        {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[N];                                                /* 存放拓扑序列 */

int TopologicalOrder();                                    /* 拓扑排序函数 */

void main()                                                /* 主 函 数    */
{
        int i, j, k, l;
        int ee[N], el[N];                                  /* 最长最短距离 */
        int path_e[N][N], path_l[N][N], n_e[N], n_l[N];    /* 记录路径数据 */

        /* 初始化数据 */
        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[N], Stack[N];

        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;
}

运行结果:

时间: 2024-12-30 05:19:47

动态规划算法计算网络的最长路线和最短路线的相关文章

《IS-IS网络设计解决方案》一6.2 使用SPF算法计算IS-IS路由

6.2 使用SPF算法计算IS-IS路由 IS-IS网络设计解决方案 ISO 10589附录C2定义了使用SPF算法进行IS-IS协议的路由计算.RFC 1195附录C定义了SPF算法的修改版本从而使IS-IS协议支持IP路由选择.Dijkstra算法产生网络拓扑的最短路径树,从而确定去往不同目标的最短(最优)路径并放入IP路由表.为了获得IP路由的最佳路径,IP子网会被看作是最短路径树的树叶.网络事件只会导致链路状态数据包中IP可达性条目的改变,而不要求重新计算整个最短路径树.在这种状况下,I

五大常用算法之二:动态规划算法(DP)

一.基本概念     动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移.一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划. 二.基本思想与策略     基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息.在求 解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解.依次解决各子问题,最后一个子问题就是初始问题的解.

用动态规划算法对最大子串问题的java实现

最大字串问题描述大概就是给定2个字符串,找出他们两个共有的最长字符串.比如一个是"tabcfg"另外一个"abckj"那么最大子串就是"abc". 动态规划算法最重要的就是分解问题,找出递归.说一下我的思考思路,首先拿到2个字符串,如何找到最长子串呢? 1.假设他们(字符串a,b)的头字母不相同的话,那么分别去掉首字母比较,也就是说用a.subString(1)和b比较,用 b.subString(1)和a比较,最长子字符串没变吧?答案是肯定的.

动态规划算法

斐波纳契数列F(n) n 0 1 2 3 4 5 6 7 8 9 10 F(n) 1 1 2 3 5 8 13 21 34 55 89 递归 vs 动态规划 递归版本(太慢): int f(int n) { if(n <= 1) return 1; else return f(n-1)+f(n-2); } 动态规划版本(有效率!算法复杂度是 O(n)): int a[1000]; int f(int n) { a[0]=a[1]=1; for(int i=2; i<=n; i++) a[i]=

【算法导论】动态规划算法之装配线调度

        和分治算法一样,动态规划是通过组合子问题的解而解决整个问题的.但是与分治算法不同的是,动态规划算法适用于子问题不是独立的情况,也就是各子问题包含公共的子子问题.动态规划通常用于最优化问题的求解.看一个问题是否适合采用动态规划算法,主要有两个标志:最优子结构和重叠子问题. 最优子结构:问题的一个最优解包含了子问题的最优解. 重叠子问题:当一个递归算法不断地调用同一问题时,我们说该最优子问题包含重叠子问题. 动态规划算法的设计步骤如下: 1.描述最优解的结构. 2.递归定义最优解的值

通过余弦相似度算法计算用户相似度时具体怎么做

问题描述 通过余弦相似度算法计算用户相似度时具体怎么做 按用户购买的物品,具体怎么样计算...................... 解决方案 http://blog.csdn.net/cscmaker/article/details/7990600

使用prony算法计算电力系统频率的程序交流

问题描述 使用prony算法计算电力系统频率的程序交流 10C 初次使用prony算法,希望能有热心小伙伴帮帮忙啦~~!必重谢!! 解决方案 百度文库好像有一份,c++编的

hog-HOG算法计算二值化图像的特征

问题描述 HOG算法计算二值化图像的特征 HOG算法能不能计算二值化图像的特征? 若用HOG算法计算二值化图像的特征,是不是就不需要灰度化及Gamma校正? 解决方案 可以的吧,我用opencv的HoG计算特征可以直接输入图像的,什么预处理都不做也是可以的 解决方案二: 可以的吧,我用opencv的HoG计算特征可以直接输入图像的,什么预处理都不做也是可以的

c-一个5*6的二维数组,灰色的相当于1,白色相当于0,然后要你写个算法计算出计算出黑色的边的条数。

问题描述 一个5*6的二维数组,灰色的相当于1,白色相当于0,然后要你写个算法计算出计算出黑色的边的条数.