动态规划学习记录 一、最短通路问题
2013-07-30 10:42
477 查看
一、最短通路问题
模型分析:不同的城市之间相互有通路:我们要从1城市出发,最终到达n城市,最所走的最短路径,并输出任意最短路径
数据结构:邻接矩阵(n*n)
算法分析:
1、最优子结构:s[i]:存储从最底层到达i点的最短路径。
2、递推公式:自下而上:s(i)=max{s(j)+m(i,j)}(j:和i邻接的点)
3、边界条件:s[1]=0;//从1点出发,到达1点,路径为0。
4、数据存储:
5、代码实现:
模型分析:不同的城市之间相互有通路:我们要从1城市出发,最终到达n城市,最所走的最短路径,并输出任意最短路径
数据结构:邻接矩阵(n*n)
算法分析:
1、最优子结构:s[i]:存储从最底层到达i点的最短路径。
2、递推公式:自下而上:s(i)=max{s(j)+m(i,j)}(j:和i邻接的点)
3、边界条件:s[1]=0;//从1点出发,到达1点,路径为0。
4、数据存储:
Const M : array[1..7, 1..7] of integer = ( //注意:这是单向联通的图 (0, 5 ,2 ,0 ,0 ,0, 0), (0, 0, 0, 3, 2, 0, 0), (0, 0, 0, 0, 7, 4, 0), (0, 0, 0, 0, 0, 0, 4), (0 ,0, 0, 0, 0, 0, 3), (0, 0, 0, 0, 0, 0, 5), (0, 0, 0, 0, 0, 0, 0)); Var S : array[1..7] of integer; //用来存储各个结点的最短通路的数组
5、代码实现:
#include<iostream> #include<limits.h> #include<stting.h> #define maxn 1000 using namespace std; int map[maxn][maxn]; int d[maxn]; int path[maxn]; int main(){ int n; cin>>n; for(int i=1;i<=n;i++){//读入图的邻接矩阵 for(int j=1;j<=n;j++){ cin>>map[i][j]; } } //其实,如果更直观的表示,那么,d【n】=0. //for(int i=n-1;i>=1;i--)//递推构造{ // d[i]=INT_MAX;//最小值容易覆盖 // for(int j=n;j>=i+1;j--){ // if (map[i][j]>0)//表示从i到有通路 // d[i]=max(d[i],map[i][j]+d[j]);//自下而上的递推 // } //} //方法二://自我认为,更容易理解哦,同时能够输出路径 mems=et(d,0x3f3f3f3f,sizeof(d)); d =0; for(int i=n;i>=1;i--){ path[i]=0;//这样path ==0 for(int j=n;j>=n+1;j--){ if(map[i][j]>0){ d[i]=max(d[i],map[i][j]+d[j]); } } } int p=1;//从一号节点开始 while(path[p]!=0){//打印路径 cout<<p<<"->"; p=path[p]; } cout<<d[1]<<endl;//注意是自底而上,输出最短路径长度 }
相关文章推荐
- 动态规划学习记录 二、装配线调配问题
- 动态规划学习笔记之0-1背包问题
- 动态规划 之最短路径问题
- 动态规划学习:数塔问题详尽分析
- 动态规划;漂亮打印问题;时间复杂度O(n方); 思考方法记录在内;
- 【学习动态规划】两个基本的小问题
- 动态规划学习记录
- 动态规划题——最短路径问题
- 动态规划之所有点对的最短路径问题(Floyd算法)
- 开始学习动态规划---先解决下背包问题
- 动态规划问题学习路线:斐波那契数列,最大递增子序列,松鼠捡苹果,最大公共子序列,字符串编辑距离
- 算法导论学习笔记(十三):动态规划(三):01背包问题
- 动态规划与斐波那契数列问题,最短路径问题
- 【算法学习笔记】43.动态规划 逆向思维 SJTU OJ 1012 增长率问题
- ACM学习历程—SNNUOJ1213 加油站问题(动态规划 || 数学)
- 动态规划解决分层图最短路径问题
- 动态规划专题之数塔问题
- 学习笔记(五):问题记录
- 双层动态规划_吃土豆问题
- 动态规划问题