Task: | Download Speed |
Sender: | snude |
Submission time: | 2024-10-18 16:34:26 +0300 |
Language: | C++ (C++11) |
Status: | READY |
Result: | WRONG ANSWER |
test | verdict | time | |
---|---|---|---|
#1 | ACCEPTED | 0.00 s | details |
#2 | WRONG ANSWER | 0.00 s | details |
#3 | WRONG ANSWER | 0.00 s | details |
#4 | ACCEPTED | 0.00 s | details |
#5 | ACCEPTED | 0.01 s | details |
#6 | ACCEPTED | 0.00 s | details |
#7 | ACCEPTED | 0.01 s | details |
#8 | ACCEPTED | 0.00 s | details |
#9 | ACCEPTED | 0.00 s | details |
#10 | ACCEPTED | 0.00 s | details |
#11 | ACCEPTED | 0.01 s | details |
#12 | WRONG ANSWER | 0.00 s | details |
Code
#include <climits> #include <cmath> #include <iostream> #include <vector> // Debug printing #ifdef DEBUG #define deb(fmt, args...) printf("DEBUG: %d: " fmt, __LINE__, ##args) #else #define deb(fmt, args...) #endif using namespace std; using ll = long long; void print_array(vector<int> in, const string title = "Vector") { cout << title << " [\n"; for (const auto &el : in) { cout << el << " "; } cout << "\n] END\n"; } void print_matrix(vector<vector<int> > in, const string title = "Matrix") { cout << title << " [\n"; for (unsigned int i = 0; i < in.size(); i++) { cout << "row " << i << ": "; for (unsigned int j = 0; j < in[i].size(); j++) { cout << in[i][j] << " "; } cout << "\n"; } cout << "] END\n"; } ll target; ll found = true; vector<ll> path; bool visited[500]; void dfs(ll s, vector<vector<ll> > &adj, vector<vector<ll> > &edges, vector<ll> &path) { if (found) { return; } if (visited[s]) { return; }; visited[s] = true; if (s == target) { found = true; return; } for (auto u : adj[s]) { // ll a = edges[u][0]; ll b = edges[u][1]; ll c = edges[u][2]; // deb("s: %d, a: %d, b: %d, c: %d\n", s, a, b, c); if (c > 0) { path.push_back(u); dfs(b, adj, edges, path); if (found) return; path.pop_back(); } } } void find_cut(vector<ll> &nodes) { for (ll i = 1; i < 501; i++) { if (visited[i]) nodes.push_back(i); } } int main(int argc, char *argv[]) { ll n, m; cin >> n >> m; target = n; // each edge is of form (a, b, c, i) vector<vector<ll> > edges(m + 1, vector<ll>(3)); for (ll i = 1; i < m + 1; i++) { cin >> edges[i][0] >> edges[i][1] >> edges[i][2]; } // Add edges to adjacent structure // tuple contains target node, residual capacity and edge index // each element contains a vector of edges that are adjacent to the node vector<vector<ll> > adj(n + 1, vector<ll>()); for (ll j = 1; j < m + 1; j++) { adj[edges[j][0]].push_back(j); // adj[edges[j][1]].push_back(j); } // print_matrix(edges, "edges"); // print_matrix(adj, "adjacent"); ll index = 0; ll speed = 0; while (found) { found = false; for (ll i = 0; i < n + 1; i++) visited[i] = false; path.clear(); dfs(1, adj, edges, path); // print_array(path, "path"); if (found) { // add stuff ll residual = INT_MAX; // find residual capacity of the path for (auto e : path) { vector<ll> edge = edges[e]; // deb("ei: %d, c: %d\n", e, edge[2]); if (edge[2] < residual) residual = edge[2]; } // deb("res: %d\n", residual); speed += residual; // update flows for (auto e : path) { if (e < 0) { edges[-e][2] += residual; } else { edges[e][2] -= residual; } } } index++; } cout << speed << "\n"; return 0; }
Test details
Test 1
Verdict: ACCEPTED
input |
---|
4 3 1 2 5 2 3 3 3 4 6 |
correct output |
---|
3 |
user output |
---|
3 |
Test 2
Verdict: WRONG ANSWER
input |
---|
4 5 1 2 1 1 3 1 2 3 1 2 4 1 ... |
correct output |
---|
2 |
user output |
---|
1 |
Test 3
Verdict: WRONG ANSWER
input |
---|
4 5 1 2 1000000000 1 3 1000000000 2 3 1 2 4 1000000000 ... |
correct output |
---|
2000000000 |
user output |
---|
1999999999 |
Test 4
Verdict: ACCEPTED
input |
---|
2 1 2 1 100 |
correct output |
---|
0 |
user output |
---|
0 |
Test 5
Verdict: ACCEPTED
input |
---|
2 1000 1 2 1000000000 1 2 1000000000 1 2 1000000000 1 2 1000000000 ... |
correct output |
---|
1000000000000 |
user output |
---|
1000000000000 |
Test 6
Verdict: ACCEPTED
input |
---|
500 998 1 2 54 1 3 59 1 4 83 2 5 79 ... |
correct output |
---|
60 |
user output |
---|
60 |
Test 7
Verdict: ACCEPTED
input |
---|
500 998 1 2 530873053 1 3 156306296 1 4 478040476 3 5 303609600 ... |
correct output |
---|
1093765123 |
user output |
---|
1093765123 |
Test 8
Verdict: ACCEPTED
input |
---|
2 1 1 2 1 |
correct output |
---|
1 |
user output |
---|
1 |
Test 9
Verdict: ACCEPTED
input |
---|
4 5 1 2 3 2 4 2 1 3 4 3 4 5 ... |
correct output |
---|
6 |
user output |
---|
6 |
Test 10
Verdict: ACCEPTED
input |
---|
4 5 1 2 1 1 3 2 3 2 1 2 4 2 ... |
correct output |
---|
3 |
user output |
---|
3 |
Test 11
Verdict: ACCEPTED
input |
---|
10 999 1 2 1000000000 1 2 1000000000 1 2 1000000000 1 2 1000000000 ... |
correct output |
---|
111000000000 |
user output |
---|
111000000000 |
Test 12
Verdict: WRONG ANSWER
input |
---|
7 9 1 2 1 1 3 1 1 4 1 2 5 1 ... |
correct output |
---|
2 |
user output |
---|
1 |