從第一行任一格仔出發,到最後一行任一格仔,可以傳送到相同的魔法格里,經過不同的魔法格會損傷不同的生命(如果之前經過過就不會)。求最大剩餘生命。
顯然最短路啊。
因為同乙個魔法格內可以互相傳送,所以就按照魔法格的點權建點。
把每乙個點拆成入點和出點,之間連長度為這個點損耗的生命值的邊。
接下來,如果點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;
}