栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

最短路问题(动态规划解法)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

最短路问题(动态规划解法)

题目描述

下图表示城市之间的交通路网,线段上的数字表示费用,单向通行由A->E。试用动态规划的最优化原理求出A->E的最省费用
 

输入

输入整数n表示有n个城市
然后是n行n列数据,第i行n个数据表示城市i到各个城市之间的距离,如果没有路径到达该城市,则数据为0

输出

输出最短路径值及经过的城市,格式见样例

样例输入 Copy

10
0  2  5  1  0  0  0  0  0  0
0  0  0  0 12 14  0  0  0  0
0  0  0  0  6 10  4  0  0  0
0  0  0  0 13 12 11  0  0  0
0  0  0  0  0  0  0  3  9  0
0  0  0  0  0  0  0  6  5  0
0  0  0  0  0  0  0  0 10  0
0  0  0  0  0  0  0  0  0  5
0  0  0  0  0  0  0  0  0  2
0  0  0  0  0  0  0  0  0  0

样例输出 Copy

minlong=19
1 3 5 8 10
AC代码:
#include
#include
#include
#include
#define N 1050
using namespace std;
int n,m,k;
int dist[N];
int a[N][N];
int nex[N];
int dp(int u)//前面的点都遍历过后,可以得出前u各点每个点的最优值,最后考虑终点就能成立
{
	if(u>=n)//输入值错误直接返回
		return 0;
	if(dist[u]!=-1)
		return dist[u];//已经得出dist的话直接作为dp值返回 
	for(int i=1;i<=n;i++)
	{
		if(a[u][i] && (dist[u]==-1 || dist[u]>a[u][i]+dp(i)))//先要走一遍才可以考虑所有情况,所以这里用||   
		{
			dist[u]=a[u][i]+dp(i);
			nex[u]=i;//记录下一个走的是哪个点,dist反正是从小到大更新的,不用怕前边没有考虑到	
		}
	}
	return dist[u];
}
void dayin(int u)
{
	cout<>n;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			cin>>a[i][j];
		}
	}
	memset(dist,-1,sizeof dist);
	cout<<"minlong="< 
下面两段代码引自:Star77777的博客 
正推dp:  
#include 
using namespace std;
 
const int maxn = 1e9;
int mp[10001][10001], dp[10001], p[10001];
 
void print(int k) {
	if (k == 0) return;
	print(p[k]);
	cout << k << " ";
}
 
int main()
{
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++) {
		dp[i] = maxn;
		for (int j = 1; j <= n; j++) {
			cin >> mp[i][j];
		}
	}	
	dp[1] = 0;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j < i; j++) {
			if (mp[j][i] && dp[i] > dp[j] + mp[j][i] ) {
				dp[i] = dp[j] + mp[j][i];
				p[i] = j;
			}
		}
	}
	cout << "minlong=" << dp[n] << endl;
	print(n);
	return 0;
}
逆推dp:
#include 
using namespace std;
 
int mp[205][205], p[205], dp[205];
 
int main()
{
	int n, a[205], maxn = 0, k;
	cin >> n;
	for (int i = 1; i <= n; i++) {
		dp[i] = 100000000;
		for (int j = 1; j <= n; j++) {
			cin >> mp[i][j];
		}
	}
	dp[n] = 0;
	for (int i = n; i >= 1; i--) {
		for (int j = i + 1; j <= n; j++) {
			if (mp[i][j] && dp[i] > dp[j] + mp[i][j]) {
				dp[i] = dp[j] + mp[i][j];
				p[i] = j;
			}
		}
	}
	cout << "minlong=" << dp[1] << endl;
	k = 1;
	while (k) {
		cout << k << " ";
		k = p[k];
	}
	cout << endl;
	return 0;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/768413.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号