日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

小雨坐地铁

發(fā)布時間:2023/12/3 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 小雨坐地铁 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

鏈接:

時間限制:C/C++ 1秒,其他語言2秒
空間限制:C/C++ 524288K,其他語言1048576K
64bit IO Format:%lld

題目描述

小雨所在的城市一共有 m 條地鐵線,分別標(biāo)號為 1 號線,2 號線,……,m 號線。整個城市一共有 n 個車站,編號為 1~n 。其中坐 i 號線需要花費(fèi) ai的價格,每坐一站就需要多花費(fèi) bi的價格。i 號線有 ci個車站,而且這 ci個車站都已知,如果某一站有多條地鐵線經(jīng)過,則可以在這一站換乘到另一條地鐵線,并且能多次換乘。現(xiàn)在小雨想從第 ss 個車站坐地鐵到第 t
個車站,地鐵等待時間忽略不計,求最少花費(fèi)的價格,若不能到達(dá)輸出 -1 。(地鐵是雙向的,所以 s 可能大于 t)

輸入描述:

第一行輸入四個正整數(shù) n,m,s,t分別表示車站個數(shù),地鐵線數(shù),起點(diǎn)站和終點(diǎn)站。 第二行到第 m + 1行,每行前三個數(shù)為
ai,bi,ci,分別表示坐 i 號線的價格,i 號線每坐一站多花的價格,i 號線車站個數(shù)。接下來 ci個數(shù),表示 i
號線的每一個車站的編號,單調(diào)遞增。

輸出描述:
共一行,一個數(shù)表示最小花費(fèi),若不能到達(dá)輸出 -1 。
示例1
輸入

5 2 1 4 2 2 3 1 3 5 2 1 4 2 3 4 5

輸出

7

說明
坐 1 號線:花費(fèi) 2;
1→3:花費(fèi) 2;

換乘 2 號線:花費(fèi) 2;
3→4:花費(fèi) 1;

所以最小總花費(fèi)為 7 。

題解:
我也是毫無頭緒,不知道該怎么下手做,看完別人的題解,來講講自己的理解
我們要用到分層圖
建立m+1層圖,前m層自然就是每一條的地鐵線,但地鐵線是有可能交叉的,也就是擁有共同車站,所以在第m+1層給每個車站建立一個虛點(diǎn),用于和前m層對應(yīng)的車站相連,注意是建雙向邊,因為地鐵可來回,從虛點(diǎn)到地鐵線上需要花費(fèi),花費(fèi)坐這條線的價格,從地鐵線上到虛點(diǎn)花費(fèi)為0
具體可以看看圖:

例題中求1—>4 ,
從虛點(diǎn)1出發(fā),到第一條線1,花費(fèi)為2,
從1再到3 花費(fèi)為2
從第一條線3再到虛點(diǎn)3 花費(fèi)為0
虛點(diǎn)3到第二條線3 花費(fèi)為2
從第二條線3到4 花費(fèi)為1
總花費(fèi)為7

代碼:

#include<bits/stdc++.h> using namespace std; typedef long long LL; const int maxn = 1e8+2; int n,m,s,t,head[maxn],dis[maxn],ant,x;; priority_queue<pair<int,int> ,vector<pair<int,int> >,greater<pair<int,int> > >q; struct Node{ int to,next,w; }edge[maxn<<1];void add(int u,int v,int w) {edge[ant].next = head[u];edge[++ant].to = v;edge[ant].w = w;head[u] = ant; } void dijkstra(int s) {int u,d,v;dis[s] = 0;q.push(pair<int,int> (0,s));while(!q.empty()){u = q.top().second;d = q.top().first;q.pop();if(d > dis[u]) continue;for(int i=head[u];i;i=edge[i].next){v = edge[i].to;if(dis[v] > dis[u]+edge[i].w){dis[v] = dis[u]+edge[i].w;q.push(pair<int,int> (dis[v],v));}}} } int main() { int a,b,c;cin>>n>>m>>s>>t;for(int i=1;i<=n*(m+1);++i) dis[i] = maxn;for(int i=1;i<=m;++i){cin>>a>>b>>c;int pre = -1;while(c--){cin>>x;if(pre != -1){add(i*n+x,i*n+pre,b);add(i*n+pre,i*n+x,b);}add(x,i*n+x,a);//虛邊到火車站費(fèi)用是做這個火車的費(fèi)用 add(i*n+x,x,0);//火車站到虛邊費(fèi)用為0 pre = x;//存上一個車站 }}dijkstra(s);if(dis[t] == maxn) cout<<"-1";else cout<<dis[t];return 0; }

總結(jié)

以上是生活随笔為你收集整理的小雨坐地铁的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。