题目描述:
共有1,2,3,4,5,6个城市,一个人长驻城市5,需要坐飞机到其他城市出差。题目给定各个城市之间的飞行时间。
当机场出现大雾时,不能从该城市出发,其他城市也不能到达该城市。
输入目的城市,与大雾城市,输出飞行时间,及路径。
当不可达时,飞行时间为1000,路径输出“[]”
解题思路,按题目给出的数据,初始化数组,不可达时设为-1,再判断输入的大雾城市。如果大雾城市为5,直接输出1000与“[]”即可,若不是,采用最短路径求法,求出最短路径。
#include <stdio.h>
#include <string.h>
int dijkstrapath(int graph[6][6],int dist[6],int path[6],int v){
int i,j,k,min;
int visited[6]={0,0,0,0,0,0}; //visited数组用来存储顶点是否访问,0为未访问
//初始化
for(i=0;i<6;i++)
{
if(graph[v][i]>0&&i!=v) //如果顶点与起始点相邻,则更新dist[i]的值
{
dist[i]=graph[v][i];
path[i]=v;
}
else{ //如果不相邻,则将dist[i]的值设为1000
dist[i]=1000;
path[i]=-1;
}
}
visited[v]=1; //初始化后,将起始顶点设为已访问
//开始循环求出剩下的路径
for(i=1;i<6;i++)
{
//先找出这次循环中路径最短的点
min=1000;
for(j=0;j<6;j++){
if(dist[j]<min&&visited[j]==0)
{
min=dist[j];
k=j;
}
}
//k为此轮找出的节点
visited[k]=1;
//此时min中存储的为起始节点到节点k的最短距离。
//更新dist[i]的值,如果dist[i]<min+graph[i][j],则更新。
for(j=0;j<6;j++){
if(visited[j]==0&&graph[k][j]>0&&graph[k][j]+min<dist[j]){
dist[j]=graph[k][j]+min;
path[j]=k;
}
}
}
}
int main(){
//初始化矩阵
int graph[6][6]={0,2,10,5,3,-1,-1,0,12,-1,-1,10,-1,-1,0,-1,7,-1,2,-1,-1,0,2,-1,4,-1,-1,1,0,-1,3,-1,1,-1,2,0};
int dist[6],path[6];
int result[6]={0,0,0,0,0,0};
int i,j;
int des,fog;
scanf("%d",&des);
scanf("%d",&fog);
if(fog==5){
printf("1000\n[]\n");
return 0;
}
for(i=0;i<6;i++)
if(i!=fog-1){
graph[i][fog-1]=-1;
graph[fog-1][i]=-1;
}
//起始点为顶点5
dijkstrapath(graph,dist,path,4);
j=des-1;
printf("%d\n",dist[des-1]);
if(dist[des-1]==1000)
printf("[]\n");
else{
i=5;
while(path[j]!=4)
{
result[i]=path[j]+1;
i--;
j=path[j];
}
printf("[5,");
for(i=0;i<6;i++)
if(result[i]!=0)
printf("%d,",result[i]);
printf("%d]\n",des);
}
return 0;
}
本文介绍了一个基于Dijkstra算法的飞机路径规划程序。该程序能够计算从一个固定城市出发到其他城市的最短飞行时间及路径,并考虑了特定城市因大雾无法起飞的情况。通过使用邻接矩阵和访问标记来寻找最短路径。

被折叠的 条评论
为什么被折叠?



