CSU 1808 地鐵 最短路變形

2021-08-01 22:20:40 字數 1167 閱讀 4157

題意:icpccamp 有 n 個地鐵站,用 1,2,…,n 編號。 m 段雙向的地鐵線路連線 n 個地鐵站,其中第 i 段地鐵屬於 ci 號

線,位於站 ai,bi 之間,往返均需要花費 ti 分鐘(即從 ai 到 bi 需要 ti 分鐘,從 bi 到 ai 也需要 ti 分鐘)。

眾所周知,換乘線路很麻煩。如果乘坐第 i 段地鐵來到地鐵站 s,又乘坐第 j 段地鐵離開地鐵站 s,那麼需要額外花費 |ci-

cj | 分鐘。注意,換乘只能在地鐵站內進行。

bobo 想知道從地鐵站 1 到地鐵站 n 所需要花費的最小時間。

解法:這題如果把點當作狀態的話有些不妥

其實這題因為有了額外花費這個條件,應該把邊當作狀態

dis[i]表示走過i這條邊打到edge[i].v的最少花費

這樣的話就2∗m條邊

把邊看作點來做最短路,但是這題的邊數未知

所以spfa會tle,所以要用dijkstra+heap

在寫的過程中,發現了之前乙個沒注意的問題,pair

#include 

using

namespace

std;

typedef

long

long ll;

typedef pairpii;

#define mp(x,y) make_pair(x,y)

const

int maxn = 500010;

int head[maxn], edgecnt;

void init()

struct edgee[maxn*2];

void add(int u, int v, int num, int c)

ll dis[maxn];//經過第i條邊,到達e[i].v的最小花費

bool vis[maxn];

ll dij(int s, int t)

ll ans=1e18;

while(!q.empty())

for(int i=head[u]; ~i; i=e[i].next)}}

return ans;

}int main()

ll ans=dij(1,n);

printf("%lld\n", ans);

}return

0;}

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 之間,往返均需...

CSU 1808 地鐵(最短路)

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

CSU1808 地鐵 dijkstra變形

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