Cod sursa(job #2954831)

Utilizator IRadu1529Radu Ionescu IRadu1529 Data 15 decembrie 2022 16:33:13
Problema Flux maxim Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#include <stdio.h>
#include <vector>
#include <cstring>
#include <iostream>
#include <fstream>
#include <queue>
using namespace std;

ifstream fin("maxflow.in");
ofstream fout("maxflow.out");


#define NMAX 1024
#define pb push_back
#define sz size()
#define mp make_pair
#define INF 0x3f3f3f3f

int capacity[NMAX][NMAX];
int flow[NMAX][NMAX];
int parent[NMAX];
vector<int> G[NMAX];
int n, m, maxFlow;
int cd[NMAX];
int viz[NMAX];

int BF()
{
	int i, j, nod, V;

	cd[0] = 1;
	cd[1] = 1;
	memset(viz, 0, sizeof(viz));
	viz[1] = 1;

	for (i = 1; i <= cd[0]; i++)
	{
		nod = cd[i];
		for (j = 0; j < G[nod].sz; j++)
		{
			V = G[nod][j];
			if (capacity[nod][V] == flow[nod][V] || viz[V]) continue;
			viz[V] = 1;
			cd[++cd[0]] = V;
			parent[V] = nod;
			if (V == n) return 1;
		}
	}

	return 0;
}

void read() {
	fin >> n >> m;

	while (m--) {
		int a, b, c;
		fin >> a >> b >> c;
		G[a].push_back(b);
		G[b].push_back(a);
		capacity[a][b] = c; // muchia de inaintare 
		capacity[b][a] = 0; // muchia de intoarcere (intial nu se poate face undo deoarece nu trece nimic)
	}
}

int main(){

	read();

	int fmin, nod;

	for (maxFlow = 0; BF(); maxFlow += fmin)
	{
		fmin = INF;
		for (nod = n; nod != 1; nod = parent[nod])
			fmin = min(fmin, capacity[parent[nod]][nod] - flow[parent[nod]][nod]);
		for (nod = n; nod != 1; nod = parent[nod])
		{
			flow[parent[nod]][nod] += fmin;
			flow[nod][parent[nod]] -= fmin;
		}
	}

	fout << maxFlow;
	
	return 0;
}