程设训练作业1.4——最少旅费问题

【问题描述】

已知六个城市A,B,C,D,E,F之间的所有直飞航线及票价,若从城市A出发到城市D去旅游,最少路费开支是多少?

【输入形式】

六个城市的航线及票价存储在当前目录下的文件lufei.txt中。

【输出形式】

最少路费的值

【样例输入】

文本中每一行表示一条航线及相应票价,所有航线按单向考虑。例如:

A B 200

B A 250

B C 300

上述三行分别表示城市A到城市B有一条航线,票价为200;城市B到城市A有一条航线,票价为250;城市B到城市C有一条航线,票价为300。字符与字符,字符与数字之间用一个空格隔开。
【样例输出】

1000

输出最少路费的整数值即可

【样例说明】
【评分标准】

输出的最少路费值正确则得分,错误则不给分。提交程序文件名为travelling.c

算法说明

最少旅费问题即最短路径问题,是数据结构中常见的问题。在数据结构中常用的求最短路径的方法包括以下两种:

  1. 迪杰斯特拉算法:求1个顶点到其余各顶点的最短路径
  2. 弗洛依德算法:求任意两顶点间的最短路径
    在解决此问题时,采取迪杰斯特拉算法。
#include <stdio.h>
#include <stdlib.h>
#define INFINITY 1000000000


int dijkstra(int a[][6]){
    int allshort[6]; //存储顶点A到每个顶点的最短路径
    int visited[6]; //标记是否访问过
    int i,j,k,min,min_num;
    for(i=0;i<6;i++){
        allshort[i]=a[0][i]; //初始化
        visited[i]=0;
    }
    visited[0] = 1;
   for(i=1;i<6;i++){
        min_num = INFINITY; //初始化最短路径为无穷大
        for(j=0;j<6;j++){
            if(allshort[j]<min_num && visited[j]==0){ //选取最短路径中最短的一条且未访问的
                min_num = allshort[j];
                min = j;  //存储最短路径的顶点
            }
        }
        visited[min]=1;  //修改标记
        for(k=0;k<6;k++){
            if(a[min][k]+allshort[min] < allshort[k] && k!=0 && visited[k] == 0){ //当以该新顶点作为中转的路径长度小于现存的最短路径时,且未访问过,且不为顶点A
                allshort[k] = a[min][k]+allshort[min]; //更新最短路径
            }
        }

   }
   return allshort[3]; //返回A到顶点D的最短路径

}
int main()
{
    FILE *f = fopen("lufei.txt","r");
    int a[6][6];
    int i,j,tem3;
    char tem1=NULL,tem2;
    //初始化邻接矩阵
    for(i=0;i<6;i++)
        for(j=0;j<6;j++){
            a[i][j] = INFINITY;
    }
    //从文件中读取图信息
    fscanf(f,"%c",&tem1);
    //while(tem1!=' ' && tem1 != '\n'){
    for(i=0;i<60;i++){
        fgetc(f); //读取空格
        fscanf(f,"%c",&tem2);
        fgetc(f);//读取空格
        fscanf(f,"%d",&tem3);
        fgetc(f);//读取换行符
        if(tem1 !=' '&&tem1 != '\n'&&tem2 !=' '&&tem2 !='\n'){
            a[tem1-65][tem2-65]=tem3; //存入矩阵
        }
        fscanf(f,"%c",&tem1);
    }
    fclose(f);

    printf("%d",dijkstra(a)); 

    return 0;
}

该题主要是要熟悉迪杰斯特拉算法,并对该算法进行变形即可。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值