題意: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 記憶體不足。領接表?不...