G 房間迷宮(優化dj最短路)

2021-09-16 21:13:09 字數 1745 閱讀 9774

題目鏈結

驗證碼:jwjtxdy

題目描述

雞尾酒被困入了乙個迷宮!

這個迷宮總共有n個房間組成,雞尾酒初始在1號房間,n號房間為迷宮的出口。每進入一次第i個房間都需要繳納ai的過路費(包括初始的一號房間)。每個房間有一張紙條和乙個箱子。紙條上寫著的數字di代表雞尾酒下乙個可以到達的房間編號。

雞尾酒也可以選擇花費bi的金錢開啟箱子,箱子中有乙個密碼ci,開啟箱子之後雞尾酒可以移動到i+k號房間,其中c可被k整除。但如果i+k>n,則不能移動。

求雞尾酒從走出迷宮的最小花費。若雞尾酒無法走出迷宮,輸出-1。

輸入描述

輸入第一行乙個n,代表迷宮共有n個房間(n<2e5)

接下來有n行,每行包含四個整數ai,bi,ci,di,意義如題面所描述。其中(ai,bi,ci,di≤2e5)

輸出描述

輸出一行乙個整數代表走出迷宮的最小花費。

樣例輸入 1

51 2 2 4

2 2 2 2

1 1 2 2

100 1 1 1

1 1 1 1

樣例輸出 1

這題顯然是個最短路,我們只要注意存邊的時候將c的因子囊括進來就好了,我們可以先篩選每個數的因子,利用埃氏篩同時加vector存因子:

for

(int i=

1; i++i)

}

存邊的時候還要注意i-i的距離為0,接下來就是沒有什麼好說的了,就是乙個優先佇列+vector優化的迪傑斯特拉最短路:

#include

#include

#include

#include

#include

#include

#include

#define ll long long

#define inf 999999999999

#define mac 200050

using namespace std;

struct node

;struct node2 };

vectorg[mac]

;vector<

int>yinzi[mac]

;ll dis[mac]

;int vis[mac]

;int a[mac]

,b[mac]

,c[mac]

,d[mac]

;voiddj(

int s)

;int

main()

} scanf (

"%d"

,&n)

;for

(int i=

1; i<=n; i++

)for

(int i=

1; i<=n; i++

)for

(int j=

0; jsize()

; j++)}

for(

int i=

1; i<=n; i++

) dis[i]

=inf;dj(

1);if

(dis[n]

==inf) printf (

"-1\n");

else printf (

"%lld\n"

,dis[n]

+a[1])

;return0;

}voiddj(

int s)}}

}

迷宮最短路徑

include include using namespace std const int max n 100,max m 100 const int inf 100000000 使用pair表示狀態時,使用typedef會更加方便一些 typedef pairp 輸入 char maze max ...

迷宮最短路 2108 2 222

include queue include cstring using namespace std typedef pairp int n,m char mz 105 105 int mark 105 105 int ans 0 int dx int dy int bfs int c,int l r...

迷宮最短路徑

問題描述 小a同學現在被困在了乙個迷宮裡面,他很想從迷宮中走出來,他可以向上 向下 向左 向右移動 每移動一格都需要花費1秒的時間,不能夠走到邊界之外。假設小a現在的位置在s,迷宮的出口在e,迷宮可能有多個出口。問小a想要走到迷宮出口最少需要花費多少秒?並輸出從起點到最近出口的路徑。任務要求 1 迷...