华为实习生机试2017.03第三题

本文介绍了一个基于Dijkstra算法的飞机路径规划程序。该程序能够计算从一个固定城市出发到其他城市的最短飞行时间及路径,并考虑了特定城市因大雾无法起飞的情况。通过使用邻接矩阵和访问标记来寻找最短路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:
共有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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值