Cod sursa(job #2647397)

Utilizator ardutgamerAndrei Bancila ardutgamer Data 4 septembrie 2020 13:21:05
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.65 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <queue>

using namespace std;

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

const int INF = 1e17;
const int NMAX = 10005;

struct edge {
	int y, pos, cap, f = 0;
	edge() {}
	edge(int y, int x, int cap){this->y = y;this->pos = x;this->cap = cap;}
};

vector<edge>g[NMAX];
int dist[NMAX], cap[NMAX][NMAX];
int n, m, s, t, a, b, c;
queue<int>q;

void addEdge(int x, int y, int cap)
{
	g[x].push_back(edge(y, (int)g[y].size(), cap));
	g[y].push_back(edge(x, (int)g[x].size() - 1, 0));
}
   
int bfs()
{
	for (int i = 1; i <= n; i++)
		dist[i] = -1;
	dist[s] = 0;
	q.push(s);
	while (!q.empty())
	{
		int u = q.front();
		q.pop();
		for (edge v : g[u])
		{
			if (v.cap - v.f > 0 && dist[v.y] == -1)
			{
				dist[v.y] = dist[u] + 1;
				q.push(v.y);
			}
		}
	}
	return (dist[t] != -1);
}

int dfs(int u, int flow)
{
	if (u == t)
		return flow;
	for (int i = 0; i < g[u].size(); i++)
	{
		edge& e = g[u][i];
		int remainingCapacity = e.cap - e.f;
		if (remainingCapacity > 0 && dist[e.y] == dist[u] + 1)
		{
			int minCap = dfs(e.y, min(flow, remainingCapacity));
			if (minCap > 0)
			{
				e.f += minCap; //muchia curenta
				g[e.y][e.pos].f -= minCap;
				return minCap;
			}
		}
	}
	return 0;
}

int maxFlow()
{
	int flow = 0, minCap;
	while (bfs())
	{
		while ( (minCap = dfs(s, INF)) && minCap > 0)
			flow += minCap;
	}
	return flow;
}

int main()
{
	fin >> n >> m;
	s = 1;
	t = n;
	while (m--)
	{
		fin >> a >> b >> c;
		addEdge(a, b, c);
	}
	fout << maxFlow() << "\n";
	return 0;
}