题解:P9724 [EC Final 2022] Chase Game
:::info[题目描述]{close}
Shou 教授被 Pang 教授在一个
如果瞬移了一次,那么以后的伤害都是
:::info[代码]{close}
#include<bits/stdc++.h>
#define int long long
#define pi pair<int, int>
#define xx first
#define yy second
using namespace std;
const int N = 1e5 + 10;
int n, m, k, d, dk[N], dn[N], ans = LLONG_MAX, dis[N];
vector<int> G[N];
bool vis[N];
int get(int l, int r){
return (l + r) * (r - l + 1) / 2;
}
int gs(int x){
return x / d * get(1, d) + get(d + 1 - x % d, d);
}
void bfs(int x, int *dis){
queue<int> q;
q.push(x);
memset(vis, 0, sizeof vis);
vis[x] = 1;
while(!q.empty()){
int u = q.front();
q.pop();
for(int v : G[u]){
if(!vis[v]){
vis[v] = 1;
q.push(v);
dis[v] = dis[u] + 1;
}
}
}
return ;
}
void dij(int x){
priority_queue<pi, vector<pi>, greater<pi>> q;
memset(dis, 0x3f, sizeof dis);
memset(vis, 0, sizeof vis);
dis[x] = 0;
q.push({0, x});
while(!q.empty()){
int u = q.top().yy;
q.pop();
if(vis[u])continue;
vis[u] = 1;
for(int v : G[u]){
if(dk[v] >= d)ans = min(ans, dis[u] + gs(dn[v] + 1));
else if(dis[u] + d - dk[v] < dis[v]){
dis[v] = dis[u] + d - dk[v];
q.push({dis[v], v});
}
}
}
return ;
}
inline int read(){
int x;
cin>>x;
return x;
}
signed main(){
cin.tie(nullptr)->sync_with_stdio(false);
n = read(), m = read(), k = read(), d = read();
for(int i = 1; i <= m; i ++){
int u = read(), v = read();
G[u].push_back(v);
G[v].push_back(u);
}
bfs(k, dk), bfs(n, dn), dij(1);
cout << min(ans, dis[n]);
return 0;
}
:::