題目大意:
有一層不超過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...