一百貼紀念! 最短路 列舉 小薩的煩惱

2021-07-30 04:07:56 字數 1417 閱讀 4541

題目描述

小薩將給出一張地圖,它可以看做乙個有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 

#include

#include

using

namespace

std;

int n,s,t,a[101][101],d[101],i,j,mi;

bool b[101];

void dij()

b[u]=1;

for (i=1;i<=n;i++)

if (!b[i]&&a[u][i]!=2147483647&&d[u]+a[u][i]int main()

mi=2147483647;

for (i=1;i<=n;i++)

for (j=1;j<=n;j++)

if (a[i][j]!=2147483647)

if (mi*2>t) printf("you are day dreaming!");

else

printf("%d",mi*2);

return

0;}

hdu 2363 最短路 列舉)

思路 和之前hdu上做過的一題很像。就是先求求出所有的高度差,排序後列舉,每次都一次spfa,求出dist,若dist n inf,說明是在最小高度差下找到了最短路徑,直接break即可。另外,發現若不用visited標記的話,時間是其兩倍。orz.以後還是老老實實加visited 吧。1 incl...

hdu 3986 最短路 列舉)

思路 先spfa求出最短路,然後列舉刪除最短路上的邊,每次刪除一條邊,就求一次最短路,然後去最大的那個就行了。可以重邊的問題沒考慮完善,wa了好多次啊!1 include2 include3 include4 include5 using namespace std 6const int maxn ...

hdu 2363 最短路 列舉)

思路 和之前hdu上做過的一題很像。就是先求求出所有的高度差,排序後列舉,每次都一次spfa,求出dist,若dist n inf,說明是在最小高度差下找到了最短路徑,直接break即可。另外,發現若不用visited標記的話,時間是其兩倍。orz.以後還是老老實實加visited 吧。1 incl...