Cod sursa(job #2959822)

Utilizator PHOSSESSEDProsie Radu-Teodor PHOSSESSED Data 2 ianuarie 2023 19:04:28
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb
#include <fstream>
#include<vector>
#include<queue>
#include<cstring>
using namespace std;

ifstream cin("maxflow.in");
ofstream cout("maxflow.out");

using ll = long long;
using vi = vector<int>;
#define f first
#define s second
#define pb push_back
#define all(x) begin(x), end(x)

#define F0R(i,a) for(int i=0; i<(a); i++)
#define FOR(i,a,b) for(int i=(a); i<=(b); i++)
#define R0F(i,a) for(int i=(a)-1; i>=0; i--)
#define ROF(i,a,b) for(int i=(b); i>=a; i--)
#define trav(a,x) for (auto& a: x)

int n, m;
int adj[1001][1001], oadj[1001][1001];

int flow[1001];
bool V[1001];
int pa[1001];

bool reachable() {
	memset(V, false, sizeof(V));
	queue<int> Q; Q.push(1); V[1]=1;
	while(!Q.empty()) {
		int i=Q.front(); Q.pop();
		FOR(j,1,n) if (adj[i][j] && !V[j])
			V[j]=1, pa[j]=i, Q.push(j);
	}
	return V[n];
}

int main() {


	cin >> n >> m;
	FOR(i,1,n) FOR(j,1,n) adj[i][j] = 0;
	F0R(i,m) {
		ll a,b,c; cin >> a >> b >> c;
		adj[a][b] += c;
	}
	int v, u;
	int maxflow = 0;
	while(reachable()) {
		int flow = 1e9;
		for (v=n; v!=1; v=pa[v]) {
			u = pa[v];
			flow = min(flow, adj[u][v]);
		}
		maxflow += flow;
		for (v=n; v!=1; v=pa[v]) {
			u = pa[v];
			adj[u][v] -= flow;
			adj[v][u] += flow;
		}
	}
	cout << maxflow << '\n';
}