您的位置:首页 > 其它

动态规划之解决多段表问题

2016-11-05 02:06 169 查看


代码如下:

#include<stdio.h>
int main()
{
int i,j,r,x,y,k,n,t;
int V[50][50][3];
int a[50];
k=5;//表示有5层
n=12;//表示有12个顶点

a[0]=0;
a[1]=1;
a[2]=5;
a[3]=8;
a[4]=11;
a[5]=12;

for(i=0; i<=n; i++)
for(j=0; j<=n; j++)
{
V[i][j][0]=0;
V[i][j][1]=1000;
}
//用三维数组储存信息
V[1][2][0]=9;
V[1][3][0]=7;
V[1][4][0]=3;
V[1][5][0]=2;
V[2][6][0]=4;
V[2][7][0]=2;
V[2][8][0]=1;
V[3][6][0]=2;
V[3][7][0]=7;
V[4][8][0]=11;
V[5][7][0]=11;
V[5][8][0]=8;
V[6][9][0]=6;
V[6][10][0]=5;
V[7][9][0]=4;
V[7][10][0]=3;
V[8][10][0]=5;
V[8][11][0]=6;
V[9][12][0]=4;
V[10][12][0]=2;
V[11][12][0]=5;

V[11][11][0]=5;
V[10][10][0]=2;
V[9][9][0]=4;
V[11][11][1]=5;
V[10][10][1]=2;
V[9][9][1]=4;

for(r=4; r>1; r--)//一层一层的求解
for(j=a[r+1]; j>a[r]; j--)
for(i=a[r]; i>a[r-1]+1; i--)
for(t=i-1; t>a[r-1]; t--)//两两比较
for(x=a[r-1]; x>a[r-2]; x--)
if(V[x][i][0]!=0&&V[x][t][0]!=0)//判断是否有边相连
{
if(V[i][i][1]+V[x][i][0]<V[t][t][1]+V[x][t][0])
{
V[x][x][0]=V[i][i][1]+V[x][i][0];
if(V[x][x][0]<=V[x][x][1])//把最小的放到V[x][x][1]中
V[x][x][1]=V[x][x][0];
}
else
{
V[x][x][0]=V[t][t][1]+V[x][t][0];
if(V[x][x][0]<=V[x][x][1])
V[x][x][1]=V[x][x][0];
}
}
else if(V[x][x][0]==0)
{
if(V[x][i][0]!=0&&V[x][t][0]==0)
V[x][x][1]=V[i][i][1]+V[x][i][0];
else if(V[x][i][0]==0&&V[x][t][0]!=0)
V[x][x][1]=V[t][t][1]+V[x][t][0];

}
for(j=a[2]; j>2; j--)
for(t=j-1; t>1; t--)
if(V[1][j][0]+V[j][j][1]<V[1][t][0]+V[t][t][1])
{
V[1][1][0]=V[1][j][0]+V[j][j][1];
if(V[1][1][0]<V[1][1][1])
V[1][1][1]=V[1][1][0];
}
else
{
V[1][1][0]=V[1][t][0]+V[t][t][1];
if(V[1][1][0]<V[1][1][1])
V[1][1][1]=V[1][1][0];
}

printf("最短路径为:%d\n",V[1][1][1]);
printf("每层相应最短路径为:\n");
printf("%d %d %d %d\n",V[2][2][1],V[3][3][1],V[4][4][1],V[5][5][1]);
printf("%d %d %d\n",V[8][8][1],V[7][7][1],V[6][6][1]);

return 0;
}

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