【问题描述】
已知六个城市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个顶点到其余各顶点的最短路径
- 弗洛依德算法:求任意两顶点间的最短路径
在解决此问题时,采取迪杰斯特拉算法。
#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;
}
该题主要是要熟悉迪杰斯特拉算法,并对该算法进行变形即可。