华为实习生机试2017.03第三题

来源:互联网 发布:丰田致享 知乎 编辑:程序博客网 时间:2024/04/30 02:47

题目描述:
共有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;}
1 0
原创粉丝点击