问题描述
可以做一次车(一张车票可用于往返),走路时间是边权两倍,坐车时间就是边权。给出每个点到其他点距离(若为0则不相连),给出限制时间和目的地,问能否在限定时间内往返。
输入
第一行有三个整数N、T、S 。接下来是一个N*N的邻接矩阵。两两车站之间的距离不超过10^9。
输出
若小萨他们不能在限定时间内赶回学校,那么输出“You are day dreaming!”(不包括引号)。否则,输出一个整数,为他们所需要花费的最少时间。
样例输入
4 5 4
0 1 1 1
1 0 1 1
1 1 0 1
1 1 1 0
样例输出
2
算法讨论
a[i,j,1]表示不做车耗时,a[i,j,2]表示坐车耗时,然后将Floyd略微改动一下即可。
const
maxn=102;
var
a:array[1..maxn,1..maxn,1..2] of longint;
i,j,k,n,t,s:longint;
begin
read(n,t,s);
for i:=1 to n do
for j:=1 to n do
begin
read(a[i,j,2]);
if a[i,j,2]=0
then a[i,j,2]:=100000001;
a[i,j,1]:=a[i,j,2]*2;
end;
for k:=1 to n do
for i:=1 to n do
for j:=1 to n do
if (j<>k) and (i<>k) then
begin
if a[i,k,1]+a[k,j,1]<a[i,j,1]
then a[i,j,1]:=a[i,k,1]+a[k,j,1];
if a[i,k,1]+a[k,j,2]<a[i,j,2]
then a[i,j,2]:=a[i,k,1]+a[k,j,2];
if a[i,k,2]+a[k,j,1]<a[i,j,2]
then a[i,j,2]:=a[i,k,2]+a[k,j,1]
end;
a[1,s,2]:=a[1,s,2]*2;
if a[1,s,2]<=t
then writeln(a[1,s,2])
else writeln('You are day dreaming!')
end.
Pixiv ID:58898400