Task: | Internet connection |
Sender: | natalia |
Submission time: | 2018-09-15 19:31:05 +0300 |
Language: | C++ |
Status: | READY |
Result: | ACCEPTED |
test | verdict | time | |
---|---|---|---|
#1 | ACCEPTED | 0.02 s | details |
#2 | ACCEPTED | 0.01 s | details |
#3 | ACCEPTED | 0.02 s | details |
#4 | ACCEPTED | 0.01 s | details |
#5 | ACCEPTED | 0.02 s | details |
#6 | ACCEPTED | 0.01 s | details |
#7 | ACCEPTED | 0.03 s | details |
#8 | ACCEPTED | 0.02 s | details |
#9 | ACCEPTED | 0.02 s | details |
#10 | ACCEPTED | 0.03 s | details |
Compiler report
input/code.cpp: In function 'int main(int, const char**)': input/code.cpp:96:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare] for(int i = 0; i <= n; i++){ ~~^~~~ input/code.cpp:97:26: warning: comparison between signed and unsigned integer expressions [-Wsign-compare] for(int j = 0; j <= n; j++){ ~~^~~~ input/code.cpp:102:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare] for(int i = 0; i < m; i++){ ~~^~~ input/code.cpp: In instantiation of 'std::__cxx11::list<T_NODE> bfs(const T_VALUE*, T_NODE, T_NODE, T_NODE) [with T_NODE = unsigned int; T_VALUE = long unsigned int]': input/code.cpp:80:27: required from 'T_VALUE max_flow(T_VALUE*, T_NODE, T_NODE, T_NODE) [with T_NODE = unsigned int; T_VALUE = long unsigned int]' input/code.cpp:107:69: required from here input/code.cpp:9:22: warning: comparison between signed and unsigned...
Code
#include <iostream> #include <list> #include <queue> template<typename T_NODE, typename T_VALUE> std::list<T_NODE> bfs(const T_VALUE *data, const T_NODE n, const T_NODE v1, const T_NODE v2){ T_NODE visited[n + 1]; for(int i = 1; i <= n; i++) visited[i] = 0; visited[v1] = v1; std::queue<T_NODE> queue = {}; queue.push(v1); while(!queue.empty()){ T_NODE v = queue.front(); queue.pop(); if(data[v * (n + 1) + v2] > 0){ visited[v2] = v; break; } for(int i = 1; i <= n; i++){ if(visited[i] == 0 && data[v * (n + 1) + i] > 0){ visited[i] = v; queue.push(i); } } } std::list<T_NODE> result = {}; if(visited[v2] != 0){ result.push_front(v2); T_NODE v = v2; while(v != v1){ v = visited[v]; result.push_front(v); } } return result; } template<typename T_NODE, typename T_VALUE> T_VALUE path_max_throughput(const T_VALUE *data, const T_NODE n, std::list<T_NODE> path){ typename std::list<T_NODE>::iterator it = path.begin(); T_NODE v1 = *(it++); T_VALUE result = data[v1 * (n + 1) + *it]; if(it != path.end()){ v1 = *(it++); while(it != path.end()){ T_VALUE value = data[v1 * (n + 1) + *it]; if(value < result){ result = value; } v1 = *(it++); } } return result; } template<typename T_NODE, typename T_VALUE> void path_add_flow(T_VALUE *data, const T_NODE n, std::list<T_NODE> path, const T_VALUE flow){ typename std::list<T_NODE>::iterator it = path.begin(); T_NODE v1 = *(it++); while(it != path.end()){ data[v1 * (n + 1) + *it] -= flow; data[*it * (n + 1) + v1] += flow; v1 = *(it++); } } template<typename T_NODE, typename T_VALUE> T_VALUE max_flow(T_VALUE *data, const T_NODE n, const T_NODE source, const T_NODE target){ typename std::list<T_NODE> path; T_VALUE flow = 0; do{ path = bfs<T_NODE>(data, n, source, target); if(!path.empty()){ T_VALUE throughput = path_max_throughput<T_NODE, T_VALUE>(data, n, path); path_add_flow<T_NODE, T_VALUE>(data, n, path, throughput); flow += throughput; } } while (!path.empty()); return flow; } int main(int argc, const char * argv[]) { unsigned int n, m; std::cin >> n >> m; unsigned long *data = (unsigned long *)malloc((n + 1) * (n + 1) * sizeof(unsigned long)); for(int i = 0; i <= n; i++){ for(int j = 0; j <= n; j++){ data[i * (n + 1) + j] = 0; } } for(int i = 0; i < m; i++){ unsigned int a, b; std::cin >> a >> b >> data[a * (n + 1) + b]; } std::cout << max_flow<unsigned int, unsigned long>(data, n, 1, n) << "\n"; 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 |