QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#628281 | #6306. Chase Game | TokaiZaopen | WA | 1ms | 5828kb | C++20 | 3.1kb | 2024-10-10 19:26:02 | 2024-10-10 19:26:05 |
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, n);
int now = d;
for (int i = 1; i <= n; i++)
{
sum[i] = sum[i - 1] + now;
now--;
if (now <= 0)
now = d;
}
for (int i = 1; i <= n; i++)
w[i] = dis[i];
dij(a, pos);
vector<int> ter;
for (int i = 1; i <= n; i++)
{
if (dis[i] == d && i != 1)
ter.push_back(i);
for (auto it : a[i])
{
int to = it.to;
if (dis[to] < d)
b[i].push_back({to, d - dis[to]});
if (dis[i] == d)
{
b[to].push_back({i, sum[w[i] + 1]});
}
}
}
if (dis[n] < d)
ter.push_back(n);
int ans = inf;
if (dis[1] > d)
ans = sum[w[1]];
dij(b, 1);
for (int i = 0; i < ter.size(); i++)
{
#ifdef MING_LE
cout << i << " " << ter[i] << " " << dis[ter[i]] << '\n';
#endif
ans = min(ans, dis[ter[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: 1ms
memory: 3572kb
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: 3856kb
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: 0
Accepted
time: 0ms
memory: 5828kb
input:
10 9 4 1 4 3 1 2 7 6 6 5 8 9 9 10 5 4 8 7 3 2
output:
9
result:
ok 1 number(s): "9"
Test #4:
score: -100
Wrong Answer
time: 0ms
memory: 3616kb
input:
10 20 9 1 9 5 2 9 4 5 10 5 7 3 1 8 7 1 7 5 3 4 3 1 7 8 3 8 9 3 10 6 9 1 1 6 8 5 6 2 1 10 2 1
output:
3
result:
wrong answer 1st numbers differ - expected: '1', found: '3'