Cod sursa(job #2728198)

Utilizator bogdanvladmihaiBogdan Vlad-Mihai bogdanvladmihai Data 22 martie 2021 21:20:50
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.49 kb
#include <bits/stdc++.h>

using namespace std;

#define int unsigned int

ofstream out("maxflow.out");

const int inf = (int)1e9 + 5;
const int max_n = (int)1e3 + 5;

int n, m;

int r[max_n][max_n];

vector<int> g[max_n];

bool visited[max_n];

int lvl[max_n];

class InParser {
private:
	FILE *fin;
	char *buff;
	int sp;
  static const int zz = 3000;
	char read_ch() {
		++sp;
		if (sp == zz) {
			sp = 0;
			fread(buff, 1, zz, fin);
		}
		return buff[sp];
	}

public:
	InParser(const char* nume) {
		fin = fopen(nume, "r");
		buff = new char[zz]();
		sp = zz - 1;
	}

	InParser& operator >> (int &n) {
		char c;
		while (!isdigit(c = read_ch()) && c != '-');
		int sgn = 1;
		if (c == '-') {
			n = 0;
			sgn = -1;
		} else {
			n = c - '0';
		}
		while (isdigit(c = read_ch())) {
			n = 10 * n + c - '0';
		}
		n *= sgn;
		return *this;
	}

	InParser& operator >> (long long &n) {
		char c;
		n = 0;
		while (!isdigit(c = read_ch()) && c != '-');
		long long sgn = 1;
		if (c == '-') {
			n = 0;
			sgn = -1;
		} else {
			n = c - '0';
		}
		while (isdigit(c = read_ch())) {
			n = 10 * n + c - '0';
		}
		n *= sgn;
		return *this;
	}
};

bool bfs() {
  for (int i = 1; i <= n; ++i) {
    visited[i] = false;
  }
  queue<int> q;
  visited[1] = true;
  q.push(1);
  while ((int)q.size() > 0) {
    int u = q.front();
    q.pop();
    for (int v : g[u]) {
      if (!visited[v] && r[u][v] > 0) {
        q.push(v);
        visited[v] = true;
        lvl[v] = 1 + lvl[u];
      }
    }
  }
  return visited[n];
}

InParser in("maxflow.in");

int dfs(int u, int flow) {
  if (u == n) {
    return flow;
  }
  for (int v : g[u]) {
    if (!visited[v] && r[u][v] > 0) {
      if (lvl[v] == 1 + lvl[u]) {
        int res = dfs(v, min(flow, r[u][v]));
        if (res > 0) {
          r[u][v] -= res;
          r[v][u] += res;
          return res;
        } else {
          visited[v] = true;
        }
      }
    }
  }
  return 0;
}

int32_t main() {
  in >> n >> m;
  for (int i = 1; i <= m; ++i) {
    int u, v, c;
    in >> u >> v >> c;
    r[u][v] += c;
    g[u].push_back(v);
    g[v].push_back(u);
  }
  int flow = 0;
  while (bfs() == true) {
    int pmp;
    for (int i = 1; i <= n; ++i) {
      visited[i] = false;
    }
    while (pmp = dfs(1, inf)) {
      for (int i = 1; i <= n; ++i) {
        visited[i] = false;
      }
      flow += pmp;
    }
  }
  out << flow << "\n";
  return 0;
}