您的位置:首页 > 其它

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

2017-04-06 16:59 281 查看
题目描述

小萨将给出一张地图,它可以看做一个有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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: