您的位置:首页 > 其它

动态规划学习记录 一、最短通路问题

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、数据存储:

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;//注意是自底而上,输出最短路径长度

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: