Submission details
Task:Internet connection
Sender:lautat
Submission time:2018-09-15 15:18:39 +0300
Language:C++
Status:READY
Result:ACCEPTED
Test results
testverdicttime
#1ACCEPTED0.02 sdetails
#2ACCEPTED0.02 sdetails
#3ACCEPTED0.01 sdetails
#4ACCEPTED0.01 sdetails
#5ACCEPTED0.01 sdetails
#6ACCEPTED0.02 sdetails
#7ACCEPTED0.02 sdetails
#8ACCEPTED0.02 sdetails
#9ACCEPTED0.01 sdetails
#10ACCEPTED0.03 sdetails

Code

#include <algorithm>
#include <cstdint>
#include <deque>
#include <iostream>
#include <vector>

using std::cin;
using std::cout;
using std::deque;
using std::endl;
using std::make_pair;
using std::min;
using std::pair;
using std::vector;


#define MAX_FLOW 1000000000


pair<uint32_t, vector<size_t>> find_path(
        const size_t n, const vector<vector<uint32_t>> weights,
        const size_t start, const size_t finish) {
    vector<size_t> visited(n + 1, 0);
    visited[start] = start;

    deque<size_t> next;
    next.push_back(start);

    while (next.size() > 0 && next.front() != finish) {
        const size_t current = next.front();
        next.pop_front();

        for (size_t j = 1; j <= n; j++) {
            if (visited[j] == 0 && weights[current - 1][j - 1]) {
                visited[j] = current;
                next.push_back(j);
            }
        }
    }

    vector<size_t> path;
    uint32_t max_flow = MAX_FLOW + 1;

    for (
            size_t current = finish;
            current != 0 && current != start;
            current = visited[current]
        ) {

        const size_t next = visited[current];

        if (next != current && next != 0) {
            max_flow = min(max_flow, weights[next - 1][current - 1]);
            path.push_back(current);
        }
    }

    path = vector<size_t>(path.rbegin(), path.rend());

    return make_pair(max_flow % (MAX_FLOW + 1), path);
}


int main() {
    size_t n;
    size_t m;
    cin >> n >> m;

    const size_t start = 1;
    const size_t finish = n;

    vector<vector<uint32_t>> weights(n, vector<uint32_t>(n, 0));

    for (size_t i = 0; i < m; i++) {
        size_t a;
        size_t b;
        uint32_t c;
        cin >> a >> b >> c;

        weights[a - 1][b - 1] = c;
    }

    uint64_t flow = 0;

    while (true) {
        const auto result = find_path(n, weights, start, finish);
        const uint32_t current_flow = result.first;
        const vector<size_t> path = result.second;

        if (current_flow == 0) {
            break;
        }

        flow += current_flow;

        size_t previous = start;
        for (auto i : path) {
            weights[previous - 1][i - 1] -= current_flow;
            weights[i - 1][previous - 1] += current_flow;

            previous = i;
        }
    }

    cout << flow << endl;

    return 0;
}

Test details

Test 1

Verdict: ACCEPTED

input
10 20
5 6 19
4 5 47
3 5 7
4 9 62
...

correct output
73

user output
73

Test 2

Verdict: ACCEPTED

input
10 20
2 4 63
7 9 54
6 7 16
2 3 9
...

correct output
110

user output
110

Test 3

Verdict: ACCEPTED

input
10 20
5 6 90
2 3 46
7 8 80
6 7 60
...

correct output
29

user output
29

Test 4

Verdict: ACCEPTED

input
10 20
3 4 76
5 7 8
3 8 71
4 7 24
...

correct output
95

user output
95

Test 5

Verdict: ACCEPTED

input
10 20
1 8 22
6 7 40
4 5 20
8 10 77
...

correct output
156

user output
156

Test 6

Verdict: ACCEPTED

input
100 1000
63 85 864540192
22 91 974117435
64 66 953124912
85 88 6080960
...

correct output
4397669179

user output
4397669179

Test 7

Verdict: ACCEPTED

input
100 1000
36 93 760720873
12 75 175717522
78 79 340128710
80 83 181753465
...

correct output
5298558023

user output
5298558023

Test 8

Verdict: ACCEPTED

input
100 1000
20 60 909693891
55 91 570199535
21 41 118646902
37 82 824735480
...

correct output
5466229311

user output
5466229311

Test 9

Verdict: ACCEPTED

input
100 1000
26 44 753330451
62 67 821574279
70 95 219303983
7 44 980013084
...

correct output
4893925638

user output
4893925638

Test 10

Verdict: ACCEPTED

input
100 1000
15 89 501388091
50 71 396801720
15 92 324349822
29 85 184420157
...

correct output
6956499595

user output
6956499595