HDU 2112 HDU Today(最短路,dijkstra)

本文讨论了使用Dijkstra算法解决公交车路径最短时间问题。通过输入多个公交线路和起点终点信息,该算法能有效计算出从任意起点到终点的最短行驶时间。程序实现了将站牌名称转换为数字标识,构建邻接矩阵,并调用Dijkstra算法进行路径搜索。

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

PS:楼主月赛由于没有看清楚N的含义,把多组数据测试看成了一组数据,悲剧WR好多次,比赛完才反应过来,到手的六分木有了。。T^T。

题目描述 : 一个人要做公交车去一个地方,告诉你很多种公交的路线,再告诉你起点位置跟终点位置,让你求最短时间。到达不了输出-1。很显然,最短路问题,话不多说Dijkstra上。


#include <cstdio>

#include <cstring>

const int MAXCOST = 99999;

const int Gmax = 155;

const int Nmax = 35;

using namespace std;

typedef struct                          
{
    char name[Nmax];
}node;

int key;                                               //用于记录每次图顶点的个数。

int main()
{
    int judge(char s[],node station[]);
    void Dijkstra(int f,int Graph[][Gmax],int Distance[Gmax]);
    int time,y,x,f;
    node station[10010];                                         //将站牌名字转换为数字。
    int Graph[155][155];
    int Distance[155];
    int n,u;
    while(scanf("%d",&n) && n != -1)     //n表示下面公交有多少,数据有多组,n=-1,表示退出。
    {
        char start[Nmax],end[Nmax];          //第一次输入表示起点跟终点。
        scanf("%s %s",start,end);
        strcpy(station[0].name,start);        //起点默认为0。
        key = 1;
        judge(end,station);                   //judge生成站牌名字对应的数字,
        memset(Graph,0x3f,sizeof(Graph));
        f=judge(end,station);              //记录end的数字。用于dijkstra输出起点到终点的最短路径。
        while(n--)                                                                   
        {
            scanf("%s",start);
            scanf("%s",end);
            scanf("%d",&time);
            x=judge(start,station);                //将站牌转化为数字。
            y=judge(end,station);
            Graph[x][y] = time;                 //双向问题
            Graph[y][x] = time;
        }
        for(int i = 0 ; i<key; i++)           //图邻接矩阵的的对角线为零。
        {
            Graph[i][i] = 0;
        }
        Dijkstra(f,Graph,Distance);
   }
    return 0;
}

int judge(char s[],node station[])                  // 将站牌转化为对应的数字。
{
    for(int i = 0 ; i < key ; i++)
    {
        if(strcmp(station[i].name,s) == 0)
        {
            return i;
        }
    }
    strcpy(station[key].name,s);
    return key++;
}

void Dijkstra(int f,int Graph[][Gmax],int Distance[Gmax])    //dijkstra算法求最短路径
{
    int s[Gmax];
    int mindis,dis;
    int i,j,u;
    for(i=0;i<key;i++)                                    //对S数组初始化。
    {
        Distance[i]=Graph[0][i];
        s[i]=0;
    }
    s[0]=1;                                           //标记v0.
    for(i=0;i<key;i++)
    {
        mindis=MAXCOST;
        for(j=0;j<key;j++)
        {
            if(s[j]==0 && Distance[j]<mindis)       //每一次循环比较得到最短值。
            {
                u=j;
                mindis=Distance[j];
            }
        }
        s[u]=1;   //标记u.
        for(j=0;j<key;j++)
        {
            if(s[j]==0)
            {
                dis=Distance[u]+Graph[u][j];
                Distance[j]=(Distance[j]<dis)?Distance[j]: dis;   //修改从v0到其他顶点的最短距离。
            }
        }
    }
   if(Distance[f]== 0x3f3f3f3f)                //表示到达不了终点,即找不到最短路。
    {
        printf("-1\n");
    }
    else
    {
        printf("%d\n",Distance[f]);
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值