题目描述
下图表示城市之间的交通路网,线段上的数字表示费用,单向通行由A->E。试用动态规划的最优化原理求出A->E的最省费用
输入
输入整数n表示有n个城市
然后是n行n列数据,第i行n个数据表示城市i到各个城市之间的距离,如果没有路径到达该城市,则数据为0
输出
输出1号点到n号点的最短路径值及经过的城市,格式见样例
样例输入 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 我认为解决这个题的思路还是比较清楚的,只要一步一步来,a数组放的是初始数据,b数组放的是改变后的数据,c数组放的是数组中的数据有没有被使用过的,d数组放的是来到这个数据的前一行,e数存的是输出的数据,具体看我的代码
提示
n<=12
#include<iostream>
using namespace std;
int a[12][12];
int b[12][12];
int c[12][12];
int d[12][12];
int e[1000];
int main()
{
int n;
cin >> n;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
cin >> a[i][j];
b[i][j] = a[i][j];
}
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
c[i][j] = 0;
}
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
if (a[i][j] != 0)
{
for (int k = 1; k <= n; k++)
{
if (c[j][k]==0&&b[j][k]!=0)
{
b[j][k] = a[j][k]+b[i][j];
c[j][k] = 1;
d[j][k] = i;
}
else
{
if( (b[j][k] > a[j][k] + b[i][j])&&b[j][k]!=0)
{
b[j][k] = a[j][k] + b[i][j];
d[j][k] = i;
}
}
}
}
}
}
int min = 100000;
int flag;
for (int i = 1; i <= n; i++)
{
if (b[i][n] != 0 && b[i][n] < min&&c[i])
{
min = b[i][n];
flag = i;
}
}
cout << "minlong=" << min << endl;
int yuan = flag;
int x = d[flag][n];//此时x=5
int y = x;
int count = 0;
while (x!=1)
{
e[count]=d[x][flag];
int v = flag;
flag = x;
x = d[x][v];
count++;
}
for (int i = count-1; i>=0; i--)
{
cout << e[i] << " ";
}
cout << y << " ";
cout << yuan << " ";
cout << n << endl;
return 0;
}