埃雷薩拉斯尋寶 最短路

2022-09-01 10:09:11 字數 1092 閱讀 9529

從第一行任一格仔出發,到最後一行任一格仔,可以傳送到相同的魔法格里,經過不同的魔法格會損傷不同的生命(如果之前經過過就不會)。求最大剩餘生命。

顯然最短路啊。

因為同乙個魔法格內可以互相傳送,所以就按照魔法格的點權建點。

把每乙個點拆成入點和出點,之間連長度為這個點損耗的生命值的邊。

接下來,如果點xx和y

y有相鄰,那麼在這兩個點分別相連。

然後跑一邊dij

dij就可以了。

#include

#include

#include

#include

#define mp make_pair

using

namespace std;

const

int n=

2510

;int n,m,hp,ans,tot,head[n+n]

,dis[n+n]

,map[n]

[n];

bool used[n]

[n],vis[n+n]

;struct edge

e[n*n*

4+n]

;int

read()

void

add(

int from,

int to,

int dis)

void

dij(

)memset

(vis,0,

sizeof

(vis));

while

(q.size()

)}}}

intmain()

dij();

ans=

1e9;

for(

int i=

1;i<=n;i++)if

(dis[map[n]

[i]+m]

[i]+m];if

(ansprintf

("%d"

,hp-ans)

;else

printf

("no");

return0;

}