【一百贴纪念!】[最短路][枚举]小萨的烦恼

本文介绍了一种解决特殊场景下的最短路径问题——利用公交系统进行约会往返的算法实现。该问题通过枚举每对可达站点并计算利用公交出行的最短往返时间来解决,确保情侣能在规定时间内完成约会并返回。

题目描述
小萨将给出一张地图,它可以看做一个有N(N<=100)个结点的图。这张地图有N个公共汽车站,小萨只可以在这N个汽车站上公共汽车。有些车站之间存在一条双向通路,无论是公共汽车还是小萨,都只能走这些通路。若两个车站之间的距离为d,步行所需要的时间为2*d秒,坐公共汽车所需要的时间为d秒。小萨他们只有T秒的时间,他希望你求出他和他的MM出去约会后能否及时赶回来,若不能,则输出“You are day dreaming!”,否则输出他们所需要花费的最少时间。
注意:一张公共汽车车票可以使用两次(只可以搭乘同一辆公共汽车),即可以认为小萨去约会地点的时间和回来的时间相等。

Input
第一行有三个整数N、T、S
接下来是一个N*N的邻接矩阵。两两车站之间的距离不超过10^9。A[I,j]为0表示I和J车站不连通。
Output
若小萨他们不能在限定时间内赶回学校,那么输出“You are day dreaming!”(不包括引号)
否则,输出一个整数,为他们所需要花费的最少时间。

分析
首先吐槽一下这虐DOG的剧情。。。人工弹幕!
这题和最短路略有不同,不过都差不多。。。
坑点就是可以坐车= =
小心坐上黑车哦
关于坐车,有个效率不高(但我还是用了)
那就是枚举每个点坐车以后的时间然后疯狂dij
过程:
1、读入(废话)
2、然后枚举i<=n,j<=n并且车站间必须可通行
3、枚举过程中现将邻接矩阵枚举到的那条通路除以二(初始化时*2),然后dij,将dij得出的到每个点所需的最小的权值数组(d)中他们要到达的目的地那个值用mi来比较储存~~OK!
4、输出(二次废话)

#include <iostream>
#include <cstdio>
#include <memory.h>
using namespace std;
int n,s,t,a[101][101],d[101],i,j,mi;
bool b[101];
void dij()
{
    int mi,i,j,u;
    memset(b,false,sizeof(b));
    b[1]=1;
    for (i=1;i<=n;i++)
     d[i]=a[1][i];
    for (j=1;j<=n-1;j++)
    {
        mi=2147483647;
        for (i=1;i<=n;i++)
        if (mi>d[i]&&!b[i])
         {
            u=i;
            mi=d[i];
         }
        b[u]=1;
        for (i=1;i<=n;i++)
         if (!b[i]&&a[u][i]!=2147483647&&d[u]+a[u][i]<d[i])
          d[i]=d[u]+a[u][i];
    }
}
int main()
{
    scanf("%d%d%d",&n,&t,&s);
    for (i=1;i<=n;i++)
     for (j=1;j<=n;j++)
      {
        scanf("%d",&a[i][j]);
        a[i][j]=a[i][j]*2;
        if (a[i][j]==0) a[i][j]=2147483647;
      }
    mi=2147483647;
    for (i=1;i<=n;i++)
     for (j=1;j<=n;j++)
      if (a[i][j]!=2147483647)
       {
        a[i][j]=a[i][j]/2;
        dij();
        if (mi>d[s]) mi=d[s];
        a[i][j]=a[i][j]*2;
       }
    if (mi*2>t) printf("You are day dreaming!");
    else printf("%d",mi*2);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值