QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#628171 | #6306. Chase Game | TokaiZaopen | WA | 0ms | 5664kb | C++20 | 3.1kb | 2024-10-10 18:59:38 | 2024-10-10 18:59:39 |
Judging History
answer
#include <bits/stdc++.h>
#define int ll
using ll = long long;
// #define MING_LE
const int mod = 998244353;
const int inf = 1e18;
using namespace std;
struct info
{
int to;
int w;
};
struct node
{
int dis;
int u;
bool operator>(const node &o) const
{
return dis > o.dis;
}
};
int n, m;
int pos, d;
vector<vector<info>> a;
vector<vector<info>> b;
int dis[100010];
int w[100010];
int sum[100010];
bool vis[100010];
bool board[100010];
bool in[100010];
void dij(vector<vector<info>> &e, int st);
void solve();
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int __ = 1;
// cin >> __;
while (__--)
solve();
return 0;
}
void solve()
{
cin >> n >> m >> pos >> d;
a.resize(n + 5);
b.resize(n + 5);
for (int i = 1; i <= m; i++)
{
int u, v;
cin >> u >> v;
a[u].push_back({v, 1});
a[v].push_back({u, 1});
}
dij(a, pos);
for (int i = 1; i <= n; i++)
{
if (dis[i] == d)
board[i] = 1;
if (dis[i] < d)
in[i] = 1;
for (auto it : a[i])
{
if (dis[it.to] >= d)
continue;
b[i].push_back({it.to, d - dis[it.to]});
if (dis[i] < d)
b[it.to].push_back({i, d - dis[i]});
else
b[it.to].push_back({i, d});
}
}
sum[0] = 0;
int now = d;
for (int i = 1; i <= n; i++)
{
now--;
if (now <= 0)
now = d;
sum[i] = sum[i - 1] + now;
}
dij(a, n);
for (int i = 1; i <= n; i++)
w[i] = sum[dis[i]];
int ans = inf;
if (board[1])
{
ans = min(ans, sum[dis[1] - 1] + d);
}
dij(b, 1);
if (in[n])
ans = min(ans, dis[n]);
for (int i = 1; i <= n; i++)
{
if (!board[i])
continue;
ans = min(ans, w[i] + dis[i]);
}
cout << ans << '\n';
}
void dij(vector<vector<info>> &e, int st)
{
for (int i = 1; i <= n; i++)
{
vis[i] = 0;
dis[i] = inf;
}
dis[st] = 0;
priority_queue<node, vector<node>, greater<node>> q;
q.push({dis[st], st});
while (!q.empty())
{
int x = q.top().u;
q.pop();
if (vis[x])
continue;
vis[x] = 1;
for (auto it : e[x])
{
int u = it.to, w = it.w;
if (dis[u] > dis[x] + w)
{
dis[u] = dis[x] + w;
q.push({dis[u], u});
}
}
}
}
/*
5 5 3 1
1 2
2 4
4 5
1 3
3 5
*/
/*
13 17 12 3
1 2
2 3
3 4
4 13
5 13
7 8
7 9
7 10
7 11
7 6
12 7
1 8
8 9
9 10
10 11
11 6
6 13
*/
/*
5 4 3 3
1 2
2 3
3 4
4 5
*/
/*
6 6 4 1
1 3
3 6
1 2
2 4
4 5
5 6
*/
/*
6 7 2 3
1 2
1 3
2 4
3 4
4 6
2 5
5 6
*/
/*
20 26 4 4
1 2
2 3
3 4
4 5
5 6
6 19
4 8
4 9
4 10
4 11
4 12
4 13
1 14
14 8
14 15
15 9
15 16
16 10
16 17
17 11
17 18
18 12
18 7
7 13
19 7
19 20
*/
詳細信息
Test #1:
score: 100
Accepted
time: 0ms
memory: 3564kb
input:
5 5 3 1 1 2 2 4 4 5 1 3 3 5
output:
2
result:
ok 1 number(s): "2"
Test #2:
score: 0
Accepted
time: 0ms
memory: 5664kb
input:
13 17 12 3 1 2 2 3 3 4 4 13 5 13 7 8 7 9 7 10 7 11 7 6 12 7 1 8 8 9 9 10 10 11 11 6 6 13
output:
7
result:
ok 1 number(s): "7"
Test #3:
score: -100
Wrong Answer
time: 0ms
memory: 5628kb
input:
10 9 4 1 4 3 1 2 7 6 6 5 8 9 9 10 5 4 8 7 3 2
output:
1000000000000000000
result:
wrong answer 1st numbers differ - expected: '9', found: '1000000000000000000'