題目鏈結
驗證碼: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 迷...