Advertisement
IanisBelu

820 - Internet Bandwidth

Oct 10th, 2023
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.18 KB | Source Code | 0 0
  1. #pragma GCC optimize("Ofast,unroll-loops")
  2. #include <bits/stdc++.h>
  3.  
  4. #define sz(a) ((int)(a).size())
  5. #define all(a) (a).begin(), (a).end()
  6.  
  7. #define fi first
  8. #define se second
  9.  
  10. using namespace std;
  11.  
  12. #ifndef LOCAL
  13. #define endl '\n'
  14. #endif
  15.  
  16. typedef long long ll;
  17. typedef pair<int, int> pii;
  18.  
  19. const int NMAX = 105;
  20. const int INF = 2e9+5;
  21.  
  22. struct Edge {
  23.     int dest, flow, rev;
  24. };
  25.  
  26. int n, s, t, m;
  27. vector<Edge> g[NMAX];
  28. int d[NMAX], last[NMAX];
  29.  
  30. void io() {
  31. #ifdef LOCAL
  32.     freopen("input.txt", "r", stdin);
  33. #else
  34.     ios_base::sync_with_stdio(false);
  35.     cin.tie(0);
  36.     cout.tie(0);
  37. #endif
  38. }
  39.  
  40. void add_edge(int x, int y, int c) {
  41.     g[x].push_back({ y, c, sz(g[y]) });
  42.     g[y].push_back({ x, 0, sz(g[x]) - 1 });
  43. }
  44.  
  45. void read() {
  46.     cin >> n;
  47.     if (n == 0) exit(0);
  48.     cin >> s >> t >> m;
  49.     for (int i = 1, x, y, c; i <= m; i++) {
  50.         cin >> x >> y >> c;
  51.         add_edge(x, y, c);
  52.         add_edge(y, x, c);
  53.     }
  54. }
  55.  
  56. bool bfs() {
  57.     memset(d, 0, sizeof(d));
  58.     memset(last, 0, sizeof(last));
  59.  
  60.     queue<int> q;
  61.     q.push(s);
  62.     d[s] = 1;
  63.  
  64.     while (!q.empty()) {
  65.         int u = q.front();
  66.         q.pop();
  67.         if (u == t) continue;
  68.         for (auto &it : g[u]) {
  69.             if (!d[it.dest] && it.flow > 0) {
  70.                 d[it.dest] = d[u] + 1;
  71.                 q.push(it.dest);
  72.             }
  73.         }
  74.     }
  75.  
  76.     return d[t];
  77. }
  78.  
  79. int dfs(int x, int flow = INF) {
  80.     if (x == t) return flow;
  81.  
  82.     for (; last[x] < sz(g[x]); last[x]++) {
  83.         Edge &e = g[x][last[x]];
  84.         if (e.flow > 0 && d[e.dest] == d[x] + 1) {
  85.             if (int ret = dfs(e.dest, min(flow, e.flow))) {
  86.                 e.flow -= ret;
  87.                 g[e.dest][e.rev].flow += ret;
  88.                 return ret;
  89.             }
  90.         }
  91.     }
  92.  
  93.     return 0;
  94. }
  95.  
  96. int dinic() {
  97.     int max_flow = 0;
  98.     while (bfs()) {
  99.         while (int flow = dfs(s))
  100.             max_flow += flow;
  101.     }
  102.     for (int i = 1; i <= n; i++) g[i].clear();
  103.     return max_flow;
  104. }
  105.  
  106. signed main() {
  107.     io();
  108.     for (int i = 1; ; i++) {
  109.         read();
  110.         cout << "Network " << i << endl << "The bandwidth is " << dinic() << '.' << endl << endl;
  111.     }
  112.     return 0;
  113. }
  114.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement