[关闭]
@rg070836rg 2015-12-26T21:35:38.000000Z 字数 1625 阅读 1636

算法概论实验四

算法概论实验


  1. 实验四
  2. 实验目的与要求:掌握动态规划方法的基本思想与设计策略。
  3. 1.多段图中的最短路径问题
  4. 【问题描述】
  5. 建立一个从源点S到终点T的多段图,设计一个动态规划算法求出从ST的最短路径值,并输出相应的最短路径。
  6. 2.有向无环图中的最短路径问题
  7. 【问题描述】
  8. 建立一个从源点S到终点E的有向无环图,设计一个动态规划算法求出从SE的最短路径值,并输出相应的最短路径。

1.多段图中的最短路径问题

  1. #include<iostream>
  2. #include<cmath>
  3. #include<string.h>
  4. using namespace std;
  5. int dp[1222222],alone[1222222],a[1222222];
  6. int main()
  7. {
  8. int i,j,n,m;
  9. while(~scanf("%d",&m))
  10. {
  11. scanf("%d",&n);
  12. memset(dp,0,sizeof(dp));
  13. memset(alone ,0,sizeof(alone));
  14. for(i=1;i<=n;i++)scanf("%d",&a[i]);
  15. int tmax;
  16. for(i=1;i<=m;i++)//★分i段
  17. {
  18. tmax=-(1<<30);
  19. for(j=i;j<=n;j++)
  20. {
  21. dp[j]=_cpp_max(dp[j-1],alone[j-1])+a[j];
  22. printf("%2d %2d %2d\n",a[j],alone[j-1],dp[j]);
  23. if(j>i)alone[j-1]=tmax;
  24. if(tmax<dp[j])tmax=dp[j];
  25. }
  26. }
  27. printf("%d\n",tmax);
  28. }
  29. return 0;
  30. }

2.有向无环图中的最短路径问题

  1. #include <iostream>
  2. #include <limits.h>
  3. using namespace std;
  4. void Init_Graph(int N,int **S)
  5. {
  6. int i,j;
  7. cout<<"输入边的长度:输入1 2 4 表示点1 与 2的边的长度为 4:首数字为0表示结束输入"<<endl;
  8. cin>>i;
  9. while(i!=0)
  10. {
  11. cin>>j;
  12. cin>>S[i][j];
  13. cin>>i;
  14. }
  15. }
  16. void DP(int N,int **S,int *dist,int *from)
  17. {
  18. int i,j;
  19. for(j=0;j<N+1;j++)
  20. {
  21. if(S[1][j]<INT_MAX)
  22. {
  23. dist[j]=S[1][j];
  24. from[j]=1;
  25. }
  26. }
  27. for(j=2;j<N+1;j++)
  28. {
  29. for(i=2;i<j;i++)
  30. {
  31. if(S[i][j]<INT_MAX)
  32. {
  33. if(dist[i]+S[i][j]<dist[j])
  34. {
  35. dist[j]=dist[i]+S[i][j];
  36. from[j]=i;
  37. }
  38. }
  39. }
  40. }
  41. cout<<"最短路径为:";
  42. i=6;
  43. cout<<N<<" "<<from[i]<<" ";
  44. i=from[i];
  45. while(i!=1)
  46. {
  47. cout<<from[i]<<" ";
  48. i=from[i];
  49. }
  50. cout<<"\n";
  51. cout<<"最短距离为:"<<dist[N]<<endl;
  52. }
  53. int main()
  54. {
  55. int N;
  56. int **S,*dist,*from;
  57. int i,j;
  58. cout<<"输入点的个数:";
  59. cin>>N;
  60. S=new int*[N+1];
  61. for(i=0;i<N+1;i++)
  62. {
  63. S[i]=new int[N+1];
  64. for(j=0;j<N+1;j++)
  65. {
  66. S[i][j]=INT_MAX;
  67. }
  68. }
  69. dist=new int[N+1];
  70. for(i=0;i<N+1;i++)
  71. {
  72. dist[i]=INT_MAX;
  73. }
  74. from=new int[N+1];
  75. for(i=0;i<N+1;i++)
  76. {
  77. from[i]=0;
  78. }
  79. Init_Graph(N,S);
  80. DP(N,S,dist,from);
  81. for(i=0;i<N+1;i++)
  82. {
  83. delete []S[i];
  84. }
  85. delete []S;
  86. delete []dist;
  87. delete []from;
  88. return 0;
  89. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注