提出 #10530081


ソースコード 拡げる

#include <iostream>
#include <cmath>
#include <vector>
#include <queue>

template <class Cost = int>
struct Edge {
    int src, dst;
    Cost cost;
    Edge(int src = -1, int dst = -1, Cost cost = 1)
        : src(src), dst(dst), cost(cost){};

    bool operator<(const Edge<Cost>& e) const { return this->cost < e.cost; }
    bool operator>(const Edge<Cost>& e) const { return this->cost > e.cost; }
};

template <class Cost = int>
using Edges = std::vector<Edge<Cost>>;

template <class Cost = int>
using Graph = std::vector<std::vector<Edge<Cost>>>;

using lint = long long;
constexpr lint INF = 1LL << 50;

void solve() {
    int n, m;
    std::cin >> n >> m;

    Edges<lint> edges(m);
    Graph<lint> graph(n);
    for (auto& e : edges) {
        std::cin >> e.src >> e.dst >> e.cost;
        --e.src, --e.dst;

        graph[e.src].emplace_back(e.src, e.dst, e.cost);
        graph[e.dst].emplace_back(e.dst, e.src, e.cost);
    }

    // BFSで割り当てをする関数
    std::vector<lint> vs(n);
    std::vector<int> cs(n);
    auto paint = [&](lint w) {
        std::fill(cs.begin(), cs.end(), -1);
        vs[0] = w;
        cs[0] = 0;

        std::queue<int> que;
        que.push(0);

        while (!que.empty()) {
            int v = que.front();
            que.pop();

            for (auto e : graph[v]) {
                int u = e.dst;
                if (cs[u] != -1) continue;

                cs[u] = 1 - cs[v];
                vs[u] = e.cost - vs[v];
                que.push(u);
            }
        }
    };

    paint(0);
    bool bip = true, ok = true;
    for (auto e : edges) {
        if (cs[e.src] == cs[e.dst]) bip = false;
        if (vs[e.src] + vs[e.dst] != e.cost) ok = false;
    }

    if (bip) {
        // 各色の最小値を求める
        lint lmin = INF, rmin = INF;
        for (int v = 0; v < n; ++v) {
            if (cs[v] == 0) {
                lmin = std::min(lmin, vs[v]);
            } else {
                rmin = std::min(rmin, vs[v]);
            }
        }

        std::cout << (ok ? std::max(lmin + rmin - 1, 0LL) : 0) << std::endl;
    } else {
        // c(0)の候補を探す
        lint w = 0;
        for (auto e : edges) {
            if (cs[e.src] == cs[e.dst]) {
                w = std::abs(vs[e.src] + vs[e.dst] - e.cost);
                break;
            }
        }

        // 再度割り当てて判定
        paint(w / 2);
        ok = true;
        for (int v = 0; v < n; ++v) {
            if (vs[v] <= 0) ok = false;
        }
        for (auto e : edges) {
            if (vs[e.src] + vs[e.dst] != e.cost) ok = false;
        }

        std::cout << ok << std::endl;
    }
}

int main() {
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);
    std::ios::sync_with_stdio(false);

    solve();

    return 0;
}

提出情報

提出日時
問題 E - + Graph
ユーザ Tiramister
言語 C++14 (GCC 5.4.1)
得点 600
コード長 2808 Byte
結果 AC
実行時間 69 ms
メモリ 10880 KiB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 600 / 600
結果
AC × 3
AC × 58
セット名 テストケース
Sample sampleNo.txt, samplePath.txt, sampleTri.txt
All OK_0.txt, OK_1.txt, OK_2.txt, OK_3.txt, OK_4.txt, close_0.txt, close_1.txt, close_2.txt, close_3.txt, close_4.txt, many_0.txt, many_1.txt, many_2.txt, many_3.txt, many_4.txt, many_5.txt, many_6.txt, many_7.txt, max.txt, maxBip.txt, multiple_0.txt, multiple_1.txt, multiple_2.txt, multiple_3.txt, multiple_4.txt, multiple_5.txt, multiple_6.txt, multiple_7.txt, oddLoop.txt, oddLoop_0.txt, oddLoop_1.txt, oddLoop_2.txt, rnd_0.txt, rnd_1.txt, rnd_2.txt, rnd_3.txt, rnd_4.txt, rnd_5.txt, rnd_6.txt, rnd_7.txt, rnd_8.txt, rnd_9.txt, sampleNo.txt, samplePath.txt, sampleTri.txt, star.txt, star_0.txt, star_1.txt, unique_0.txt, unique_1.txt, unique_2.txt, unique_3.txt, unique_4.txt, unique_5.txt, unique_6.txt, unique_7.txt, unique_8.txt, unique_9.txt
ケース名 結果 実行時間 メモリ
OK_0.txt AC 48 ms 10752 KiB
OK_1.txt AC 47 ms 10752 KiB
OK_2.txt AC 50 ms 10752 KiB
OK_3.txt AC 50 ms 10752 KiB
OK_4.txt AC 49 ms 10880 KiB
close_0.txt AC 61 ms 9344 KiB
close_1.txt AC 56 ms 9216 KiB
close_2.txt AC 58 ms 9216 KiB
close_3.txt AC 62 ms 9472 KiB
close_4.txt AC 69 ms 10624 KiB
many_0.txt AC 53 ms 10368 KiB
many_1.txt AC 54 ms 10240 KiB
many_2.txt AC 54 ms 10112 KiB
many_3.txt AC 53 ms 10240 KiB
many_4.txt AC 61 ms 10240 KiB
many_5.txt AC 53 ms 10240 KiB
many_6.txt AC 55 ms 10112 KiB
many_7.txt AC 55 ms 10240 KiB
max.txt AC 30 ms 5760 KiB
maxBip.txt AC 39 ms 7168 KiB
multiple_0.txt AC 52 ms 10368 KiB
multiple_1.txt AC 54 ms 10240 KiB
multiple_2.txt AC 56 ms 10112 KiB
multiple_3.txt AC 58 ms 10240 KiB
multiple_4.txt AC 53 ms 10240 KiB
multiple_5.txt AC 59 ms 10240 KiB
multiple_6.txt AC 56 ms 10240 KiB
multiple_7.txt AC 54 ms 10240 KiB
oddLoop.txt AC 56 ms 10624 KiB
oddLoop_0.txt AC 55 ms 10496 KiB
oddLoop_1.txt AC 35 ms 6272 KiB
oddLoop_2.txt AC 53 ms 8960 KiB
rnd_0.txt AC 58 ms 10752 KiB
rnd_1.txt AC 60 ms 10240 KiB
rnd_2.txt AC 56 ms 10496 KiB
rnd_3.txt AC 61 ms 9856 KiB
rnd_4.txt AC 59 ms 9728 KiB
rnd_5.txt AC 50 ms 8064 KiB
rnd_6.txt AC 58 ms 9856 KiB
rnd_7.txt AC 60 ms 9728 KiB
rnd_8.txt AC 52 ms 8960 KiB
rnd_9.txt AC 39 ms 7168 KiB
sampleNo.txt AC 1 ms 256 KiB
samplePath.txt AC 1 ms 256 KiB
sampleTri.txt AC 1 ms 256 KiB
star.txt AC 46 ms 10480 KiB
star_0.txt AC 43 ms 10480 KiB
star_1.txt AC 43 ms 10480 KiB
unique_0.txt AC 52 ms 9344 KiB
unique_1.txt AC 52 ms 9472 KiB
unique_2.txt AC 59 ms 9472 KiB
unique_3.txt AC 58 ms 9472 KiB
unique_4.txt AC 53 ms 9472 KiB
unique_5.txt AC 59 ms 9472 KiB
unique_6.txt AC 52 ms 9472 KiB
unique_7.txt AC 53 ms 9472 KiB
unique_8.txt AC 58 ms 9472 KiB
unique_9.txt AC 53 ms 9472 KiB