CSU1808 地鐵 dijkstra變形

2021-07-29 23:08:00 字數 901 閱讀 1899

題解:由於中轉線路需要花費一定的時間,所以一般的以頂點為研究物件的dijkstra演算法就不適用了,因為在鬆弛過程中,當前節點的最短路徑不能知道是從那條線路過來的。(儲存當前結點的上一站是從那條線路過來?看似可以,但是站與站之間的線路又怎麼儲存。矩陣?[100000][100000],記憶體不足。領接表?不夠高效,因為要掃瞄鍊錶尋找)

所以就直接把邊作為研究物件。將邊的資訊記錄到edge中(包括兩端點,線路,以及通行時間)。因為edge已經包含了線路,所以鬆弛時就可以直接計算了。d[i]記錄從頂點1到頂點i的最短路徑(題目中為時間)。

**如下:

#include#include#include#include#include#include#include#include#include#include#define ll long long

#define max(a,b) (a>b?a:b)

#define min(a,b) (a>q; //佇列記錄花費的時間以及當前邊的編號

memset(vis,0,sizeof(vis));

for(int i = 0; itmp = q.top();

q.pop();

int now = tmp.second; //取邊的編號

vis[now] = 1;

int u = edge[now].v;

if(u==n) return d[now]; //如果當前邊的v為頂點n,則找到最短路徑

for(int i = head[u]; i!=-1; i = edge[i].next) //鬆弛}}

}int main()

{ int u,v,c,t;

while(scanf("%d%d",&n,&m)!=eof)

{init();

for(int i = 0; i

CSU 1808 地鐵(最短路)

題意 n個地鐵站,m條線路,地鐵站之間花費t時間,不屬於同一條線路的地鐵站需要 轉站 即加上乙個額外花費w w為線路代號的差值 求1到n的最短時間 思路 由於有轉站的影響,可以考慮將地鐵站拆點,權值是他們的差值,或者直接以邊作為點也是可以的 includeusing namespace std co...

CSU 1808 地鐵 最短路變形

題意 icpccamp 有 n 個地鐵站,用 1,2,n 編號。m 段雙向的地鐵線路連線 n 個地鐵站,其中第 i 段地鐵屬於 ci 號 線,位於站 ai,bi 之間,往返均需要花費 ti 分鐘 即從 ai 到 bi 需要 ti 分鐘,從 bi 到 ai 也需要 ti 分鐘 眾所周知,換乘線路很麻煩...

CSU 1808 地鐵 最短路變形

time limit 5000 ms memory limit 131072 kb bobo 居住在大城市 icpccamp。icpccamp 有 n 個地鐵站,用 1,2,n 編號。m 段雙向的地鐵線路連線 n 個地鐵站,其中第 i 段地鐵屬於 c i 號線,位於站 a i,b i 之間,往返均需...