zoukankan      html  css  js  c++  java
  • 15-1有向无环图中的最长路径


    1. #ifndef LONG_PATH_H
    2. #define LONG_PATH_H
    3. #include<iostream>
    4. #include<string>
    5. #define MAX 65535
    6. int graphPath_longest(int (*Graph)[5],int Length,int origin,int destin );
    7. void printf_path(int origin,int destin);
    8. #endif
    1. #include"LongPath.h"
    2. #define Max(a,b) a>b? a:b
    3. int pathStore[20];
    4. int graphPath_longest(int (*Graph)[5],int Length,int origin,int destin){
    5. int pathLength=-1;
    6. for(int i=0;i<Length; i++){
    7. if(Graph[origin][i]!=0&&Graph[origin][i]!=MAX&&origin!=destin){
    8. if(graphPath_longest(Graph,Length,i,destin)+Graph[origin][i]>pathLength){
    9. pathLength=graphPath_longest(Graph,Length,i,destin)+Graph[origin][i];
    10. pathStore[origin]=i;
    11. }
    12. }
    13. else if(origin==destin){
    14. pathStore[origin]=destin;
    15. pathLength=Max(0,pathLength);
    16. }
    17. }
    18. return pathLength;
    19. }
    20. void printf_path(int origin,int destin){
    21. int n=origin;
    22. std::cout<<"the longest path in Graph from node "<<origin<<" to node "<<destin<<std::endl;
    23. std::cout<<origin;
    24. while(n!=destin){
    25. n=pathStore[n];
    26. std::cout<<"->"<<n;
    27. }
    28. std::cout<<std::endl;
    29. }
    1. #include "LongPath.h"
    2. int main(){
    3. int Graph[5][5]={MAX};
    4. Graph[0][0]=0;
    5. Graph[0][4]=6;
    6. Graph[1][0]=9;
    7. Graph[1][1]=0;
    8. Graph[1][2]=3;
    9. Graph[2][0]=10;
    10. Graph[2][2]=0;
    11. Graph[2][3]=5;
    12. Graph[3][3]=0;
    13. Graph[3][4]=1;
    14. Graph[4][4]=0;
    15. std::cout<<"The longest path value "<<graphPath_longest(Graph,5,1,4)<<std::endl;
    16. printf_path(1,4);
    17. }


         

    注:
          本题中,我采用的解法还是使用了一般的解法思想,在该题中,我们还是采用的是固定一端不动,另一端进行优化的思想。
    也就是说,
    if(graphPath_longest(Graph,Length,i,destin)+Graph[origin][i]>pathLength){
    pathLength=graphPath_longest(Graph,Length,i,destin)+Graph[origin][i];
    pathStore[origin]=i;
    }
    ​题中的destin一直都没有改变呢。
    于是在记录优化路径时,我们只用了一维数组来解决问题,因为在每次迭代中变的只有那个origin,只要记录每次的origin就可以了
    pathStore[origin]=i
    ​每次的迭代都会求得一个最理想的i,从而我们只要记录这个理想的i就可以了。
    而且下次的origin正好是这次的i,这样就循环套在一起了。
    std::cout<<origin;
    while(n!=destin){
    n=pathStore[n];
    std::cout<<"->"<<n;
    }
    上面的代码就是循环输出的。




  • 相关阅读:
    springcloud-Netflix创建服务消费者
    Spring Cloud Zuul
    Spring Cloud 熔断器
    树莓派连接启动SSH
    win10红警黑屏和无法打开的处理
    创建索引和主键
    SQL语句增加字段、修改字段、修改类型、修改默认值
    SQL Server 事务隔离级别详解
    SQL Server数据库锁机制及类型
    SQL Server中的锁类型及用法
  • 原文地址:https://www.cnblogs.com/yml435/p/4655527.html
Copyright © 2011-2022 走看看