萌新刚学A* WA10pts 求调!玄关
查看原帖
萌新刚学A* WA10pts 求调!玄关
1069719
Enoch2013楼主2025/1/5 11:16

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;
}
2025/1/5 11:16
加载中...