社区讨论

求助大佬,第三个点出0...

P4568[JLOI2011] 飞行路线参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mi7pcavd
此快照首次捕获于
2025/11/21 01:25
4 个月前
此快照最后确认于
2025/11/21 01:25
4 个月前
查看原帖
大佬们,第三个点输出0是什么情况啊,91分只有第三个点没过。
CPP
// luogu-judger-enable-o2

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cctype>
#include <queue>
#include <cmath>

using namespace std;

const int N = 20000;
const int K = 30;
const int M = 60010;
const int INF = 2147483646;

int n, m, k, a, b, c, ec, u, dis[N * K], f[N * K], vis[K * N], ans = INF, s, t;

struct Edge
{
    int u, v, w, nxt;
}e[M * K];

struct Node
{
    int id, w;
    bool operator < (const Node &b) const
        { return w > b.w; }
};

inline void Addedge(int a, int b, int c)
{
    ++ec;
    e[ec].u = a;
    e[ec].v = b;
    e[ec].w = c;
    e[ec].nxt = f[a];
    f[a] = ec;
}

inline void read(int &x)
{
    int k = 1; x = 0;
    char c = getchar();
    while (!isdigit(c)) 
        if (c == '-') c = getchar(), k = -1;
        else c = getchar();
    while (isdigit(c))
        x = (x << 1) + (x << 3) + (c ^ 48),
        c = getchar();
    x *= k;
}

inline void Dijkstra()
{
    for (int i = 1; i <= k * n + n; ++i) dis[i] = INF; dis[s] = 0;
    priority_queue <Node> Q; Q.push((Node){s, 0});
    while (!Q.empty())
    {
        u = Q.top().id; Q.pop();
        if (vis[u]) continue;
        vis[u] = 1;
        for (int i = f[u]; i != -1; i = e[i].nxt)
            if (dis[e[i].v] > dis[u] + e[i].w)
                dis[e[i].v] = dis[u] + e[i].w,
                Q.push((Node){e[i].v, dis[e[i].v]});
    }
    for (int i = 0; i <= k; ++i)
        ans = min(ans, dis[i * n + t]);
    printf("%d\n", ans);
}

inline void Init()
{
    memset(f, -1, sizeof(f));
    read(n), read(m), read(k); read(s), read(t); ++s, ++t;
    for (int i = 1; i <= m; ++i)
    {
        read(a), read(b), read(c), ++a, ++b;
        for (int j = 0; j <= k; ++j)
            Addedge(a + j * n, b + j * n, c),
            Addedge(b + j * n, a + j * n, c);
        for (int j = 0; j < k; ++j)
            Addedge(a + j * n, b + (j + 1) * n, 0),
            Addedge(b + j * n, a + (j + 1) * n, 0);
    }	
}

signed main()
{
    Init(), Dijkstra(); return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...