Cod sursa(job #2436925)

Utilizator AlexPop28Pop Alex-Nicolae AlexPop28 Data 7 iulie 2019 17:34:37
Problema Critice Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <bits/stdc++.h>
#define DEBUG(x) cerr << (#x) << ": " << (x) << '\n'

using namespace std;

int main() {
  ifstream cin("critice.in");
  ofstream cout("critice.out");

  int n, m; cin >> n >> m;
  vector<pair<int, int>> edges; edges.reserve(m);
  vector<vector<int>> adj(n), cap(n, vector<int>(n));
  while (m--) {
    int u, v, c; cin >> u >> v >> c; --u, --v;
    adj[u].emplace_back(v);
    adj[v].emplace_back(u);
    cap[u][v] = c;
    cap[v][u] = c;
    edges.emplace_back(u, v);
  }
  int src = 0, snk = n - 1;
  while (true) {
    vector<int> q = {src};
    vector<int> parent(n, -1);
    for (int i = 0; i < (int)q.size(); ++i) {
      int node = q[i];
      for (int &x : adj[node]) {
        if (cap[node][x] > 0 && parent[x] == -1) {
          parent[x] = node;
          q.emplace_back(x);
        }
      }
    }
    if (parent[snk] == -1) {
      break;
    }
    int flow = (int)1e9 + 5;
    int node = snk;
    while (node != src) {
      flow = min(flow, cap[parent[node]][node]);
      node = parent[node];
    }
    node = snk;
    while (node != src) {
      cap[parent[node]][node] -= flow;
      cap[node][parent[node]] += flow;
      node = parent[node];
    }
  }

  vector<bool> vis(n);
  function<void(int, bool)> DFS = [&](int node, bool inv) {
    vis[node] = true;
    for (int &x : adj[node]) {
      int from = node, to = x;
      if (inv) swap(from, to);
      if (cap[from][to] > 0 && !vis[x]) {
        DFS(x, inv);
      }
    }
  };
  
  DFS(snk, 1);
  auto vis_snk = vis;
  fill(vis.begin(), vis.end(), false);
  DFS(src, 0);
  vector<int> ans;
  for (int i = 0; i < (int)edges.size(); ++i) {
    int u, v; tie(u, v) = edges[i];
    if ((cap[u][v] == 0 && vis[u] && vis_snk[v]) || (cap[v][u] == 0 && vis[v] && vis_snk[u]))
      ans.emplace_back(i + 1);
  }
  cout << ans.size() << endl;
  for (int &x : ans) cout << x << '\n';
}