Submission #3449095


Source Code Expand

/* ---------- STL Libraries ---------- */

// IO library
#include <cstdio>
#include <fstream>
#include <iomanip>
#include <ios>
#include <iostream>

// algorithm library
#include <algorithm>
#include <cmath>
#include <numeric>
#include <random>

// container library
#include <array>
#include <bitset>
#include <deque>
#include <map>
#include <queue>
#include <set>
#include <string>
#include <tuple>
#include <vector>

/* ---------- Namespace ---------- */

using namespace std;

/* ---------- Type Abbreviation ---------- */

template <typename T>
using PQ = priority_queue<T>;
template <typename T>
using GPQ = priority_queue<T, vector<T>, greater<T>>;

using ll = long long;

#define fst first
#define snd second
#define mp make_pair
#define mt make_tuple

/* ---------- conversion ---------- */

#define INT(c) static_cast<int>(c)
#define CHAR(n) static_cast<char>(n)
#define LL(n) static_cast<ll>(n)
#define DOUBLE(n) static_cast<double>(n)

/* ---------- container ---------- */

#define ALL(v) (v).begin(), (v).end()
#define SIZE(v) (LL((v).size()))

#define FIND(v, k) (v).find(k) != (v).end()
#define VFIND(v, k) find(ALL(v), k) != (v).end()

#define gsort(b, e) sort(b, e, greater<decltype(*b)>())

/* ----------- debug ---------- */

template <class T>
ostream& operator<<(ostream& os, vector<T> v) {
    os << "[";
    for (auto vv : v)
        os << vv << ",";
    return os << "]";
}

template <class T>
ostream& operator<<(ostream& os, set<T> v) {
    os << "[";
    for (auto vv : v)
        os << vv << ",";
    return os << "]";
}

template <class L, class R>
ostream& operator<<(ostream& os, pair<L, R> p) {
    return os << "(" << p.fst << "," << p.snd << ")";
}

/* ---------- Constants ---------- */

// const ll MOD = 1e9 + 7;
// const int INF = 1 << 25;
// const ll INF = 1LL << 50;
// const double PI = acos(-1);
// const double EPS = 1e-10;
// mt19937 mert(LL(time(0)));

/* ---------- Short Functions ---------- */

template <typename T>
T sq(T a) {
    return a * a;
}

template <typename T>
T gcd(T a, T b) {
    if (a > b) return gcd(b, a);
    return a == 0 ? b : gcd(b % a, a);
}

template <typename T, typename U>
T mypow(T b, U n) {
    if (n == 0) return 1;
    if (n == 1) return b /* % MOD */;
    if (n % 2 == 0) {
        return mypow(b * b /* % MOD */, n / 2);
    } else {
        return mypow(b, n - 1) * b /* % MOD */;
    }
}

ll pcnt(ll b) {
    return __builtin_popcountll(b);
}

/* v-v-v-v-v-v-v-v-v Main Part v-v-v-v-v-v-v-v-v */

class MinCostFlow {
public:
    struct edge {
        ll to;
        ll cap;
        ll cost;
        ll rev;  // path[to]中でのfromのイテレータ
        edge(ll to_, ll cap_, ll cost_, ll rev_) : to(to_), cap(cap_), cost(cost_), rev(rev_){};
    };

    explicit MinCostFlow(ll N) : MAX_V(N) {
        path.resize(MAX_V);
    }

    void add_edge(ll from, ll to, ll cap, ll cost) {
        // fromとtoの間に双方向の辺を加える
        // 有向の場合は後者のcapを0にする
        path[from].push_back(edge(to, cap, cost, path[to].size()));
        path[to].push_back(edge(from, 0, -cost, path[from].size() - 1));
    }

    ll min_cost_flow(ll s, ll g, ll f) {
        // sからgへ流量fを流すときの最小コストを求める
        // f流せない場合は最大流の最小コストを返す

        ll ret = 0;
        while (f > 0) {
            // Bellman-Fordでs-g間最短経路を求める
            vector<ll> d(MAX_V, INF), prevv(MAX_V), preve(MAX_V);
            d[s] = 0;
            while (true) {
                bool update = false;

                for (ll v = 0; v < MAX_V; ++v) {
                    if (d[v] == INF) continue;
                    for (ll i = 0; i < path[v].size(); ++i) {
                        auto e = path[v][i];

                        if (e.cap > 0 && d[e.to] > d[v] + e.cost) {
                            d[e.to] = d[v] + e.cost;
                            prevv[e.to] = v;
                            preve[e.to] = i;
                            update = true;
                        }
                    }
                }

                if (!update) break;
            }

            // これ以上流せない
            if (d[g] == INF) break;

            ll sf = f, v = g;
            while (v != s) {
                sf = min(sf, path[prevv[v]][preve[v]].cap);
                v = prevv[v];
            }

            f -= sf;
            ret += sf * d[g];

            v = g;
            while (v != s) {
                auto& e = path[prevv[v]][preve[v]];
                e.cap -= sf;
                path[v][e.rev].cap += sf;
                v = prevv[v];
            }
        }

        // 今回に限ってはマイナス
        return -ret;
    }

    const ll INF = 1LL << 50;
    vector<vector<edge>> path;
    ll MAX_V;
};


int main() {
    int N, M;
    cin >> N >> M;

    ll v[N + 1];
    for (int i = 1; i <= N; ++i) {
        cin >> v[i];
    }

    MinCostFlow mcf(N + M + 2);
    // 0         = 始点
    // 1 ~ N     = 宝箱
    // N+1 ~ N+M = 鍵
    // N+M+1     = 終点

    for (int i = 1; i <= N; ++i) {
        mcf.add_edge(0, i, 1, 0);
    }

    for (int i = 1; i <= M; ++i) {
        int x, y;
        cin >> x >> y;

        mcf.add_edge(x, N + i, 1, -v[x]);
        mcf.add_edge(y, N + i, 1, -v[y]);
        mcf.add_edge(N + i, N + M + 1, 1, 0);
    }

    cout << mcf.min_cost_flow(0, N + M + 1, N) << endl;
    return 0;
}

Submission Info

Submission Time
Task E - Treasure Hunt
User Tiramister
Language C++14 (GCC 5.4.1)
Score 0
Code Size 5682 Byte
Status TLE
Exec Time 2110 ms
Memory 79848 KB

Judge Result

Set Name All
Score / Max Score 0 / 200
Status
AC × 25
TLE × 29
Set Name Test Cases
All 00_small_n_random0, 00_small_n_random1, 00_small_n_random2, 01_small_1g_random0, 01_small_1g_random1, 01_small_1g_random2, 02_small_mg_random0, 02_small_mg_random1, 02_small_mg_random2, 10_medium_n_random0, 10_medium_n_random1, 10_medium_n_random2, 11_medium_1g_random0, 11_medium_1g_random1, 11_medium_1g_random2, 12_medium_mg_random0, 12_medium_mg_random1, 12_medium_mg_random2, 20_large_n_random0, 20_large_n_random1, 20_large_n_random2, 21_large_1g_random0, 21_large_1g_random1, 21_large_1g_random2, 22_large_mg_random0, 22_large_mg_random1, 22_large_mg_random2, 23_large_n_max0, 23_large_n_max1, 23_large_n_max2, 23_large_n_max3, 23_large_n_max4, 24_large_1g_max0, 24_large_1g_max1, 24_large_1g_max2, 24_large_1g_max3, 24_large_1g_max4, 25_large_mg_max0, 25_large_mg_max1, 25_large_mg_max2, 25_large_mg_max3, 25_large_mg_max4, 26_corner0, 26_corner1, 26_corner2, 26_corner3, 26_corner4, 26_corner5, 26_corner6, sample01, sample02, sample03, sample04, sample05
Case Name Status Exec Time Memory
00_small_n_random0 AC 1 ms 256 KB
00_small_n_random1 AC 1 ms 256 KB
00_small_n_random2 AC 1 ms 256 KB
01_small_1g_random0 AC 1 ms 256 KB
01_small_1g_random1 AC 1 ms 256 KB
01_small_1g_random2 AC 2 ms 256 KB
02_small_mg_random0 AC 1 ms 384 KB
02_small_mg_random1 AC 2 ms 512 KB
02_small_mg_random2 AC 1 ms 384 KB
10_medium_n_random0 AC 13 ms 384 KB
10_medium_n_random1 AC 6 ms 384 KB
10_medium_n_random2 AC 34 ms 640 KB
11_medium_1g_random0 AC 19 ms 512 KB
11_medium_1g_random1 AC 50 ms 512 KB
11_medium_1g_random2 AC 5 ms 512 KB
12_medium_mg_random0 AC 15 ms 384 KB
12_medium_mg_random1 AC 83 ms 640 KB
12_medium_mg_random2 AC 76 ms 640 KB
20_large_n_random0 TLE 2107 ms 41836 KB
20_large_n_random1 TLE 2108 ms 64616 KB
20_large_n_random2 TLE 2107 ms 45292 KB
21_large_1g_random0 TLE 2105 ms 23916 KB
21_large_1g_random1 TLE 2104 ms 8860 KB
21_large_1g_random2 TLE 2106 ms 23264 KB
22_large_mg_random0 TLE 2106 ms 21760 KB
22_large_mg_random1 TLE 2107 ms 33388 KB
22_large_mg_random2 TLE 2106 ms 31340 KB
23_large_n_max0 TLE 2109 ms 76904 KB
23_large_n_max1 TLE 2108 ms 79464 KB
23_large_n_max2 TLE 2109 ms 78568 KB
23_large_n_max3 TLE 2109 ms 78568 KB
23_large_n_max4 TLE 2109 ms 77288 KB
24_large_1g_max0 TLE 2109 ms 78568 KB
24_large_1g_max1 TLE 2106 ms 46572 KB
24_large_1g_max2 TLE 2109 ms 76776 KB
24_large_1g_max3 TLE 2107 ms 44412 KB
24_large_1g_max4 TLE 2107 ms 45996 KB
25_large_mg_max0 TLE 2107 ms 79848 KB
25_large_mg_max1 TLE 2109 ms 77544 KB
25_large_mg_max2 TLE 2110 ms 78696 KB
25_large_mg_max3 TLE 2109 ms 79720 KB
25_large_mg_max4 TLE 2109 ms 78312 KB
26_corner0 AC 63 ms 13548 KB
26_corner1 AC 1 ms 256 KB
26_corner2 TLE 2107 ms 42172 KB
26_corner3 TLE 2106 ms 29804 KB
26_corner4 TLE 2109 ms 72680 KB
26_corner5 TLE 2109 ms 71400 KB
26_corner6 TLE 2107 ms 74088 KB
sample01 AC 1 ms 256 KB
sample02 AC 1 ms 256 KB
sample03 AC 1 ms 256 KB
sample04 AC 1 ms 256 KB
sample05 AC 1 ms 256 KB