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;
}
上面的代码就是循环输出的。




原文地址:https://www.cnblogs.com/yml435/p/4655527.html