一、 动态规划原理解决计算图的任两结点间的距离的Floyd算法
二、:问题描述
设图G 的结点个数n=10,给定一个10*10矩阵作为图G 的成本矩阵.
其中的元素99相当于无穷,表示相应的两个结点间没有边相连
0 99 8 7 6 5 4 3 2 1
99 0 99 8 7 6 5 4 3 2
8 99 0 99 8 7 6 5 4 3
7 8 99 0 99 8 7 6 5 4
6 7 8 99 0 99 8 7 6 5
5 6 7 8 99 0 99 8 7 6
4 5 6 7 8 99 0 99 8 7
3 4 5 6 7 8 99 0 99 8
2 3 4 5 6 7 8 99 0 99
1 2 3 4 5 6 7 8 99 0
算法:三重循环。
代码
#include<stdio.h>
#include<stdlib.h>
#define N 10
#define max 99//无穷大数
void f_input1(int d[N+1][N+1]);
void f_input2(int p[N+1][N+1]);
void update(int d[N+1][N+1],int p[N+1][N+1]) ;
void print(int d[N+1][N+1],int p[N+1][N+1]);
void select(int d[N+1][N+1],int p[N+1][N+1]);
int main(){
int d[N+1][N+1];//距离
int p[N+1][N+1];//点
int i,j,k;
f_input1(d);
f_input2(p);
update(d,p);
print(d,p);
select(d,p);
return 0;
}
void f_input1(int d[N+1][N+1]){
int i=1,j=1;
FILE *fp;
fp=fopen("C:\\Desktop\\算法实验\\实验二数据.txt","r");//此处解释见文章底部
if(fp==NULL){
printf("初始化error!\n");
exit(0);
}
while(fscanf(fp,"%d",&d[i][j])!=EOF){
if(j==10){
i++; j=1;
}
else j++;
}
if(fclose(fp)){
printf("文件关闭debeat\n");
exit(0);
}
printf("D矩阵\n");
for(i=1;i<=N;i++){
for(j=1;j<=N;j++){
printf("%2d ",d[i][j]);
}
printf("\n");
}
}
void f_input2(int p[N+1][N+1]){
int i,j;
for(i=1;i<=N;i++){
for(j=1;j<=N;j++)
p[i][j]=j;
}
printf("P矩阵\n");
for(i=1;i<=N;i++){
for(j=1;j<=N;j++){
printf("%d ",p[i][j]);
}
printf("\n");
}
}
void update(int d[N+1][N+1],int p[N+1][N+1]){
int i,j,k;
for(k=1;k<=N;k++)
for(i=1;i<=N;i++)
for(j=1;j<=N;j++){
if(d[i][j]>d[i][k]+d[k][j]){
d[i][j]=d[i][k]+d[k][j];
p[i][j]=k;
}
}
}
void print(int d[N+1][N+1],int p[N+1][N+1]){
int i,j;
printf("D矩阵\n");
for(i=1;i<=N;i++){
for(j=1;j<=N;j++){
printf("%2d ",d[i][j]);
}
printf("\n");
}
printf("P矩阵\n");
for(i=1;i<=N;i++){
for(j=1;j<=N;j++){
printf("%2d ",p[i][j]);
}
printf("\n");
}
}
void select(int d[N+1][N+1],int p[N+1][N+1]){
int i,j,a,b;
printf("\n");
printf("欢迎进入循环查询,退出请输入-1 -1\n") ;
printf("请输入起点和终点,以空格隔开\n");
while(scanf("%d%d",&a,&b)&&(a!=-1)){
printf("%d->%d的最短路径长是:%d\n",a,b,d[a][b]);
printf("%d->%d的最短路径是:",a,b);
printf("%d",a);
while(1){
if(p[a][b]==b) {
printf("->%d\n",b);break;
}
printf("->%d",p[a][b]);
a=p[a][b];
}
printf("退出请输入-1 -1,继续查询请输入起点和终点\n") ;
}
}
fp=fopen("C:\\Desktop\\算法实验\\实验二数据.txt","r")这里是利用文件读入数据,到程序目录下,建立一个.txt文件,输入数据,以空格隔开。命名自己定,修改一下这条语句即可。具体可以学习一下利用文件读入数据的相关知识。