uva10801 最短路問題

2021-07-10 10:09:20 字數 1990 閱讀 2548

題目大意:

有一層不超過100層的大樓, 有n個電梯,它們的速度都不同。 而且每個電梯只能到達指定的那些樓層,而且它們都有各自的速度(即上公升一層或下降一層所用的時間)。 如果乙個人在某層走出電梯,要換乙個電梯乘,那麼他要等60秒(不管要等的是那個電梯,即使是剛剛出來的那個電梯也要等60秒)。在0層搭電梯出發時不需要等待。

乙個人從0層開始,目的地是k層, 現在要搭這些電梯,問最少需多少時間。

思路:

dijkstra演算法+ 鄰接矩陣

用g陣列儲存從i到j需要使用的最短時間。

用d陣列儲存從0到i需要使用的最短時間。

然後根據dijkstra演算法進行計算就可以了。

鄰接矩陣**:

#include 

using

namespace

std;

#include

#include

#include

const

int n =105;

const

int inf = 0x3f3f3f3f;

int n,k,d[n],g[n][n],t[n];

int num[n];

void add(int a,int b,int c)

void solve()

}if(!flag)

return;

vis[x] = 1;

for(int j = 0; j < 100; j++)

if(!vis[j] && d[j] > d[x] + g[x][j] + 60)

d[j] = d[x] + g[x][j] + 60;

}}int main() while(getchar() != '\n');

for(int q = 0; q < j ; q++)

for(int p = 0; p < q; p++)

add(num[q],num[p],t[i]);

}solve();

if(k == 0)

printf("0\n");

else

if(d[k] == inf)

printf("impossible\n");

else

printf("%d\n",d[k] - 60);

}return

0;}

spfa以及dijkstra演算法(別人的**):

#include

#include

#include

#include

#include

using

namespace

std;

typedef pairpii;

priority_queuevector

,greater>q;

const

int n = 105;

const

int inf = 1000000000;

int n, k, t[6], w[n][n], arr[n], d[n];

bool vis[n];

inline

void read_graph()while(getchar()!='\n');

for(int j=0; jfor(int k=j; kint tmp=abs(arr[j]-arr[k])*t[i];

if(tmpinline

void spfa(int src)

} }

else

if(d[i]>d[u]+w[u][i]+60)

} }

} } inline

bool dijkstra(int src)

} else

} }

} } int main()

return

0;

}

Uva10801電梯換乘 最短路

題意 有一層不超過100層的大樓,有n個電梯,它們的速度都不同。而且每個電梯只能到達指定的那些樓層,而且它們都有各自的速度 即上公升一層或下降一層所用的時間 如果乙個人在某層走出電梯,要換乙個電梯乘,那麼他要等60秒 不管要等的是那個電梯,即使是剛剛出來的那個電梯也要等60秒 在0層搭電梯出發時不需...

最短路 最短路徑問題

題目描述 平面上有n個點 n 100 每個點的座標均在 10000 10000之間。其中的一些點之間有連線。若有連線,則表示可從乙個點到達另乙個點,即兩點間有通路,通路的距離為兩點直線的距離。現在的任務是找出從一點到另一點之間的最短路徑。input 共有n m 3行,其中 第一行為乙個整數n。第2行...

uva10986 最短路徑

題目的意思就是 首先給出有幾組測試樣例 每組樣例先是 給 n 點的個數 m 邊的個數 s 起點 t 終點 然後是每條邊 以及權值.求最短路.但是因為點的數量很多,要用優化的dijkstra 優先佇列.劉汝佳書裡的模板差別只有這題是無向圖.include include include include...