題目意思:給出t條路,和草兒家相鄰的城市編號,以及草兒想去的地方的編號。問從草兒家到達草兒想去的地方的最短時間是多少。
一開始自己寫的只能處理單邊出發的情況,對於以下這幅圖,只能處理箭頭所示的方向,不能向下,於是不知道為什麼出現了百年難得一遇的runtime error(access_violation)!
我的答案是inf。= =...。這個答案應該是2。之所以第一組資料能過,是因為它只需要從編號1走即能找到最小值,而上圖是需要從編號2走才可以找到最小值。
於是只能看discuss了。yk所講的無節操!!!看完大受啟發。
dijkstra 演算法本質上只能求乙個點到其他所有點的最短距離。那麼就需要把問題轉化為單源點。可以人為地認為編號為0的點是草家,由於跟草家直接相連的點距離為0,那麼可以把這些點歸為源點。至於草兒想去的地方有多個,把這多個點也人為地歸為終點,單獨設多個點n,把這些所謂的終點連到n點裡。(這個n點**有說)。那題目就轉化為從點0到點n的最短時間是多少。
題目中還有乙個需要注意的地方,這句話:a,b 之間可能有多條路。也就是說兩點之間相連的路有多條,我們需要選擇把最短的那條路的時間記錄下來。
還有就是tle 的情況了。if 迴圈裡面對map[i][j]初始化時,千萬不能等於maxn(1000 + 5)!tle了n次!!!
#include
#include
#include
#include
using namespace std;
const int inf = 1 << 20; // inf 的設定一定要足夠的大
const int maxn = 1000 + 5;
int dist[maxn], map[maxn][maxn], vis[maxn];
int t, s, d, n;
void init()
int st, end, time;
n = 0;
for (int i = 0; i < t; i++)
n++; // 假設是理想中的終點(比最大的頂點大1)的編號
for (int i = 0; i < s; i++)
for (int i = 0; i < d; i++)
}void dijkstra()
vis[u] = 1;
for (int j = 0; j <= n; j++)}}
int main()
return 0;
}
hdu 2066 乙個人的旅行
我覺得這題應該用floyd演算法會更好一點吧,猜的,還沒學,囧.我是用dijstra暴力水過.嗯開始學floyd code include include include include include include include include include include include ...
Hdu 2066 乙個人的旅行
最短路問題 dijkstra 分析 1 本題的起始點和終點不唯一。假設有一點起始點離全部的相鄰城市的距離都是1,有一點終點離全部的想要去的目的地的距離也都是1,則將dijkstra出來的值減2即可。2 兩個城市之間的路不唯一,可有多條路,所以在輸入的時候做一下判斷,選取最小的。ac include ...
HDU2066 乙個人的旅行
problem description input 輸入資料有多組,每組的第一行是三個整數t,s和d,表示有t條路,和草兒家相鄰的城市的有s個,草兒想去的地方有d個 接著有t行,每行有三個整數a,b,time,表示a,b城市之間的車程是time小時 1 a,b 1000 a,b 之間可能有多條路 接...