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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【最短路】【spfa】小vijos P1447 Updown

發(fā)布時(shí)間:2025/3/17 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【最短路】【spfa】小vijos P1447 Updown 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

小vijos P1447 Updown

背景

開啟了升降梯的動(dòng)力之后,探險(xiǎn)隊(duì)員們進(jìn)入了升降梯運(yùn)行的那條豎直的隧道,映入眼簾
的是一條直通塔頂?shù)能壍?、一輛停在軌道底部的電梯、和電梯內(nèi)一桿控制電梯升降的巨大手
柄。
faebdc 之塔一共有 N 層,升降梯在每層都有一個(gè)??奎c(diǎn)。手柄有 M 個(gè)控制槽,第 i
個(gè)控制槽旁邊標(biāo)著一個(gè)數(shù) Ci, 滿足 C1<C2<C3<...<CM。 如果 Ci>0,表示手柄扳動(dòng)到該槽
時(shí),電梯將上升 Ci 層;如果 Ci<0,表示手柄扳動(dòng)到該槽時(shí),電梯將下降|Ci| 層;并且一定
存在一個(gè) Ci=0,手柄最初就位于此槽中。注意升降梯只能在 1~N 層間移動(dòng),因此扳動(dòng)到使
升降梯移動(dòng)到 1 層以下、N 層以上的控制槽是不允許的。
電梯每移動(dòng)一層,需要花費(fèi) 2 秒鐘時(shí)間,而手柄從一個(gè)控制槽扳到相鄰的槽, 需要花費(fèi)
1 秒鐘時(shí)間。探險(xiǎn)隊(duì)員現(xiàn)在在 1 層,并且想盡快到達(dá) N 層,他們想知道從 1 層到 N 層至少
需要多長時(shí)間?

輸入格式

第一行兩個(gè)正整數(shù) N、M
第二行 M 個(gè)整數(shù) C1、C2...CM

輸出格式

輸出一個(gè)整數(shù)表示答案,即至少需要多長時(shí)間。若不可能到達(dá)輸出-1。

樣例輸入

6 3
-1 0 2

樣例輸出

19

時(shí)間限制

各個(gè)測(cè)試點(diǎn)1s

注釋

樣例說明
手柄從第二個(gè)槽扳到第三個(gè)槽(0 扳到 2),用時(shí) 1 秒,電梯上升到 3 層,用時(shí) 4 秒。
手柄在第三個(gè)槽不動(dòng),電梯再上升到 5 層,用時(shí) 4 秒。
手柄扳動(dòng)到第一個(gè)槽(2 扳到-1),用時(shí) 2 秒,電梯下降到 4 層,用時(shí) 2 秒。
手柄扳動(dòng)到第三個(gè)槽(-1 扳倒 2),用時(shí) 2 秒,電梯上升到 6 層,用時(shí) 4 秒。
總用時(shí)為(1+4)+4+(2+2)+(2+4)=19 秒。?
數(shù)據(jù)范圍與約定
對(duì)于 30% ?的數(shù)據(jù),滿足 1≤N≤10,2<=M<=5。
對(duì)于 ?100% ?的數(shù)據(jù),滿足 1≤N≤1000,2<=M<=20,-N<C1<C2<...<CM<N

?

顯然根據(jù)題意,可以dp,但是我們很難轉(zhuǎn)移,所以,我們把所有狀態(tài)當(dāng)成點(diǎn),建邊,跑最短路即可。

1 #include<cstdio> 2 #include<algorithm> 3 #include<queue> 4 #include<cstring> 5 using namespace std; 6 #define M 400001 7 #define N 25001 8 queue<int>q; 9 int n,m,a[21],en,v[M],w[M],first[M],next[M],num[1001][21],sta,ans=2147483647,dis[N]; 10 bool inq[N]; 11 int Abs(const int &x){return x<0 ? (-x) : x;} 12 void AddEdge(const int &U,const int &V,const int &W) 13 { 14 v[++en]=V; 15 w[en]=W; 16 next[en]=first[U]; 17 first[U]=en; 18 } 19 void spfa(const int &s) 20 { 21 memset(dis,0x7f,sizeof(dis)); 22 q.push(s); inq[s]=1; dis[s]=0; 23 while(!q.empty()) 24 { 25 int U=q.front(); 26 for(int i=first[U];i;i=next[i]) 27 if(dis[v[i]]>dis[U]+w[i]) 28 { 29 dis[v[i]]=dis[U]+w[i]; 30 if(!inq[v[i]]) 31 { 32 inq[v[i]]=1; 33 q.push(v[i]); 34 } 35 } 36 q.pop(); inq[U]=0; 37 } 38 } 39 int main() 40 { 41 scanf("%d%d",&n,&m); 42 for(int i=1;i<=m;i++) scanf("%d",&a[i]); 43 for(int i=1;i<=n;i++) 44 for(int j=1;j<=m;j++) 45 { 46 num[i][j]=++en; 47 if(i==1&&a[j]==0) sta=en; 48 } en=0; 49 for(int i=1;i<=n;i++) 50 for(int j=1;j<=m;j++)//單層移動(dòng)手柄 51 for(int k=1;k<=m;k++) 52 if(j!=k) 53 AddEdge(num[i][j],num[i][k],Abs(j-k)); 54 for(int i=1;i<=n;i++) 55 for(int j=1;j<=m;j++) 56 if(a[j]!=0&&i+a[j]>=1&&i+a[j]<=n) 57 AddEdge(num[i][j],num[i+a[j]][j],(Abs(a[j])<<1)); 58 spfa(sta); 59 for(int i=1;i<=m;i++) ans=min(ans,dis[num[n][i]]); 60 printf("%d\n",ans>=2000000000 ? -1 : ans); 61 return 0; 62 }

轉(zhuǎn)載于:https://www.cnblogs.com/autsky-jadek/p/4115081.html

總結(jié)

以上是生活随笔為你收集整理的【最短路】【spfa】小vijos P1447 Updown的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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