记录编号 577223 评测结果 AAAAAAAAAAAAA
题目名称 [USACO Jan08] 架设电话线 最终得分 100
用户昵称 Gravatarlihaoze 是否通过 通过
代码语言 C++ 运行时间 0.089 s
提交时间 2022-10-27 10:42:56 内存使用 3.91 MiB
显示代码纯文本
#include "bits/stdc++.h"

using PII = std::pair<int, int>;

const int N = 1010, P = 20010;
int n, p, k;
int f[N][N];
std::map<PII, bool> st;

int e[P], ne[P], h[P], w[P], idx;

void add(int a, int b, int c) {
    e[idx] = b, ne[idx] = h[a], w[idx] = c, h[a] = idx ++;
}

void spfa() {
    std::queue<PII> q;
    q.push({ 1, 0 });
    f[1][0] = 0, st[{ 1, 0 }] = true;
    while (q.size()) {
        PII t = q.front(); q.pop();
        auto [u, nk] = t;
        st[t] = false;
        for (int i = h[u]; i != -1; i = ne[i]) {
            int v = e[i];
            if (std::max(f[u][nk], w[i]) < f[v][nk]) {
                f[v][nk] = std::max(f[u][nk], w[i]);
                if (!st[{ v, nk }]) {
                    q.push({ v, nk }),
                    st[{ v, nk }] = true;
                }
            }
            if (f[u][nk] < f[v][nk + 1] && nk < k) {
                f[v][nk + 1] = f[u][nk];
                if (!st[{ v, nk + 1 }]) {
                    q.push({ v, nk + 1 }),
                    st[{ v, nk + 1 }] = true;
                }
            }
        }
    }
}

int main() {
    freopen("phoneline.in", "r", stdin); 
    freopen("phoneline.out", "w", stdout);
    memset(f, 0x3f, sizeof f);
    memset(h, -1, sizeof h);
    std::cin >> n >> p >> k;
    for (int i = 1; i <= p; ++ i) {
        int x, y, z;
        std::cin >> x >> y >> z;
        add(x, y, z), add(y, x, z);
    }
    spfa();
    if (f[n][k] >= 0x3f3f3f3f / 2) {
        std::cout << -1 << '\n';
    } else {
        std::cout << f[n][k] << '\n';
    }
    return 0;
}