Task: | Internet connection |
Sender: | jeroenrobben |
Submission time: | 2018-09-21 16:58:57 +0300 |
Language: | C++ |
Status: | READY |
Result: | ACCEPTED |
test | verdict | time | |
---|---|---|---|
#1 | ACCEPTED | 0.02 s | details |
#2 | ACCEPTED | 0.02 s | details |
#3 | ACCEPTED | 0.02 s | details |
#4 | ACCEPTED | 0.01 s | details |
#5 | ACCEPTED | 0.02 s | details |
#6 | ACCEPTED | 0.03 s | details |
#7 | ACCEPTED | 0.02 s | details |
#8 | ACCEPTED | 0.03 s | details |
#9 | ACCEPTED | 0.01 s | details |
#10 | ACCEPTED | 0.02 s | details |
Code
#include <iostream> #include <queue> #include <vector> #define index(source, sink) ((source * amountNodes) + sink) #define MAX_CAPACITY 1000000000 using namespace std; int amountNodes, amountEdges; long totalFlow; bool bfs(int capacities [], int flows [], vector<int> neighbours [], int predecesor []) { int currentNode; queue<int> queueNodesToCheck; queueNodesToCheck.push(0); fill_n(predecesor, amountNodes, -1); while(!queueNodesToCheck.empty()) { currentNode = queueNodesToCheck.front(); queueNodesToCheck.pop(); for(int neighbourNode: neighbours[currentNode]) { if(neighbourNode != 0 && predecesor[neighbourNode] == -1 && capacities[index(currentNode, neighbourNode)] > flows[index(currentNode, neighbourNode)]) { predecesor[neighbourNode] = currentNode; queueNodesToCheck.push(neighbourNode); // cout << currentNode; // cout << " currentNode\n"; // cout << neighbourNode; // cout << " neighbourNode\n"; } } if(predecesor[amountNodes-1] != -1){ break; } } // cout << predecesor[amountNodes-1]; // cout << " pred sink\n"; return predecesor[amountNodes-1] != -1; } void increaseFlow(int capacities [], int flows [], int predecesor []) { //get flow amount int currentNode = amountNodes-1; int df = MAX_CAPACITY; int nextNode = predecesor[currentNode]; while(nextNode != -1) { df = min(df, capacities[index(nextNode, currentNode)] - flows[index(nextNode, currentNode)]); // cout << currentNode; // cout << " currentNode\n"; // cout << nextNode; // cout << " nextNode\n"; // cout << predecesor[nextNode]; // cout << " predecesor[nextNode]\n"; currentNode = nextNode; nextNode = predecesor[currentNode]; } if(df < 0) { //cout << df; cout << '\n'; } currentNode = amountNodes-1; nextNode = predecesor[currentNode]; while(nextNode != -1) { flows[index(nextNode, currentNode)] += df; flows[index(currentNode, nextNode)] -= df; currentNode = nextNode; nextNode = predecesor[currentNode]; } totalFlow += df; } long edmondsKarp(int capacities [], int flows [], vector<int> neighbours []) { int * predecesor = new int [amountNodes]; totalFlow = 0; while(bfs(capacities, flows, neighbours, predecesor)) { increaseFlow(capacities, flows, predecesor); } return totalFlow; } int main() { cin >> amountNodes >> amountEdges; vector<int> neighbours [amountNodes]; int * capacities = new int [amountNodes*amountNodes]; int * flows = new int [amountNodes*amountNodes]; fill_n(capacities, amountNodes*amountNodes, 0); fill_n(flows, amountNodes*amountNodes, 0); int source, sink, cap; for(int edgeId = 0; edgeId < amountEdges; edgeId++ ) { cin >> source >> sink >> cap; source--;sink--; neighbours[source].push_back(sink); neighbours[sink].push_back(source); capacities[index(source, sink)] = capacities[index(sink, source)] = flows[index(sink, source)] = cap; } cout << edmondsKarp(capacities, flows, neighbours) << endl; }
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 |