tyvj2032 超級源點)

2022-09-01 13:48:12 字數 1818 閱讀 6300

開啟了公升降梯的動力之後,探險隊員們進入了公升降梯執行的那條豎直的隧道,映入眼簾的是一條直通塔頂的軌道、一輛停在軌道底部的電梯、和電梯內一桿控制電梯公升降的巨大手柄。

nescafe 之塔一共有n 層,公升降梯在每層都有乙個停靠點。手柄有m個控制槽,第i 個控制槽旁邊標著乙個數ci,滿足c10,表示手柄扳動到該槽時,電梯將上公升ci 層;如果ci<0,表示手柄扳動到該槽時,電梯將下降-ci 層;並且一定存在乙個ci=0,手柄最初就位於此槽中。注意公升降梯只能在1到n 層間移動,因此扳動到使公升降梯移動到1 層以下、n 層以上的控制槽是不允許的。

電梯每移動一層,需要花費2 秒鐘時間,而手柄從乙個控制槽扳到相鄰的槽,需要花費1 秒鐘時間。探險隊員現在在1 層,並且想盡快到達n 層,他們想知道從1 層到n 層至少需要多長時間?

輸入格式:

第一行兩個正整數 n、m。

第二行m 個整數c1、c2⋯⋯cm。

輸出格式:

輸出乙個整數表示答案,即至少需要多長時間。若不可能到達輸出-1。

輸入樣例#1:

6 3

-1 0 2

輸出樣例#1:

19

對於30% 的資料,滿足1≤n≤ 10; 2≤m≤ 5。

對於100% 的資料,滿足1≤n≤1000; 2 ≤ m ≤20;-n < c1 樣例解釋

手柄從第二個槽扳到第三個槽(0 扳到2),用時1 秒,電梯上公升到3層,用時4 秒。

手柄在第三個槽不動,電梯再上公升到5 層,用時4 秒。

手柄扳動到第乙個槽(2 扳到-1),用時2 秒,電梯下降到4 層,用時2 秒。

手柄扳動到第三個槽(-1 扳倒2),用時2 秒,電梯上公升到6 層,用時4 秒。

總用時為(1+4)+4+(2+2)+(2+4)=19 秒。

把電梯處於每層,控制器處於哪個控制槽當做狀態編號

把可行狀態之間連邊

最後把m個終止狀態連向同乙個源點,即建造乙個超級源求最短路即可

#include#include

#include

#include

#include

using

namespace

std;

struct

my;struct

head

};const

int maxn=10000+10

;const

int maxm=1e6+10

;const

int nil=0x7f7f7f7f

;int

c[maxn],fa,n,m,adj[maxm],d[maxm];

bool

done[maxm];

my bian[

2*maxm];

priority_queue

q;void myinsert(int u,int v,int

w)int id(int x,int

y)void dij(int

s) }

}}int

main()

for (int i=1;i<=n;i++)}}

for(int i = 1; i <= m; i++)

myinsert(id(n, i), n * m + 1, 0);//

把m個終止狀態連向同乙個源點,即建造乙個超級源

dij(id(1

,top));

if(d[n*m+1]>=nil) printf("-1"

);

else printf("

%d",d[n*m+1

]);return0;

}

D Buy a Ticket 超級源點 最短路

題意 給定一張帶權圖,每個點都有權值ai。對於每個點i,找到乙個j,使得2 dis i,j aj的值最小。2 n 2 1 05,1 m 2 105 1 v i,ui n,v i ui 1 w i 10 12,1 ai 1 012 2 n 2 10 5,1 m 2 10 5,1 v i,u i n,v...

加超級源點的Kruskal演算法

東東在老家農村無聊,想種田。農田有 n 塊,編號從 1 n。種田要灌氵 眾所周知東東是乙個魔法師,他可以消耗一定的 mp 在一塊田上施展魔法,使得黃河之水天上來。他也可以消耗一定的 mp 在兩塊田的渠上建立傳送門,使得這塊田引用那塊有水的田的水。1 n 3e2 黃河之水天上來的消耗是 wi,i 是農...

FZYZOJ 下片 題解(最短路 超級源點)

第一行n,m,表示總格有n個點,m條網路連線 接下來m行,表示每條網路連線所連線的a b點和線的長度。接下來乙個數t1,表示uoi有多少臺電腦。下一行t1個數,表示uoi每台電腦的編號。接下來乙個數t2,表示有多少臺伺服器。下一行t2個數,表示每台伺服器編號。題意轉化 給你一些源點和一些匯點,求一條...