AC on #2, 其余WA
code:
#include <bits/stdc++.h>
#define N 20005
using namespace std;
typedef pair<int, int> PI;
typedef pair<int, PI> PII;
int n, m, s, t, k, x, y, len, idx = 0, pre1[N], pre2[N], dis[N], cnt[N];
bool vis[N];
struct node
{
int to, next, len;
} a[N];
void add(int pre[], int u, int v, int len)
{
a[++idx] = {v, pre[u], len};
pre[u] = idx;
}
void dijkstra()
{
priority_queue<PI, vector<PI>, greater<PI>> heap;
memset(dis, 127, sizeof dis);
dis[t] = 0;
heap.push(make_pair(0, t));
while (heap.size())
{
PI u = heap.top();
heap.pop();
auto [d, p] = u;
if (vis[p])
continue;
vis[p] = true;
for (int i = pre2[p]; i; i = a[i].next)
{
int to = a[i].to;
if (d + a[i].len < dis[to])
{
dis[to] = d + a[i].len;
heap.push(make_pair(d + a[i].len, to));
}
}
}
}
void a_star()
{
priority_queue<PII, vector<PII>, greater<PII>> heap;
heap.push(make_pair(dis[s], make_pair(0, s)));
while (heap.size())
{
PII u = heap.top();
heap.pop();
auto [d, p] = u.second;
cnt[p]++;
if (cnt[p] == k && p != t)
printf("%d-", p);
if (cnt[t] == k)
{
printf("%d", d);
return;
}
for (int i = pre1[p]; i; i = a[i].next)
{
int to = a[i].to;
if (cnt[to] < k)
heap.push(make_pair(d + a[i].len + dis[to], make_pair(d + a[i].len, to)));
}
}
printf("No");
}
int main()
{
scanf("%d%d%d%d%d", &n, &m, &k, &s, &t);
while (m--)
{
scanf("%d%d%d", &x, &y, &len);
add(pre1, x, y, len);
add(pre2, y, x, len);
}
dijkstra();
a_star();
return 0;
}