求任两结点间的最短距离 Floyd算法 (动态规划)

  一、  动态规划原理解决计算图的任两结点间的距离的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文件,输入数据,以空格隔开。命名自己定,修改一下这条语句即可。具体可以学习一下利用文件读入数据的相关知识。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值