Cod sursa(job #1389610)

Utilizator alexb97Alexandru Buhai alexb97 Data 16 martie 2015 14:19:37
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include <fstream>
#include <vector>
#include <bitset>
#include <cstring>
#include <queue>
#include <algorithm>
#define INF 0x3f3f3f3f
using namespace std;

ifstream is("maxflow.in");
ofstream os("maxflow.out");

int n, m;
vector<vector<int>> g;
int c[1020][1020];
bitset<1024> v;
queue<int> Q;
int t[1020];

bool BFS(int x, int sink)
{
	v.reset();
	v[x] = 1;
	Q.push(x);
	while(!Q.empty())
	{
		x = Q.front();
		Q.pop();
		if (x == sink)
            continue;
		for(const auto & y : g[x])
		{
			if(!v[y] && c[x][y] > 0)
			{
				v[y] = 1;
				t[y] = x;
				Q.push(y);
			}
		}
	}
	return v[n];
}

int MaxFlow(int source, int sink)
{
	int maxflow = 0;
	int fmin;
	while(BFS(source, sink))
	{
		for(const auto & x: g[sink])
		{
			if(!v[x] || c[x][sink] <= 0)
			{
				continue;
			}
			t[sink] = x;
			fmin = INF;
			for(int i = sink; i != source; i = t[i])
			{
				fmin = min(fmin, c[t[i]][i]);
			}
			
			if(!fmin) continue;
			
			for(int i = sink; i != source; i = t[i])
			{
				c[t[i]][i] -= fmin;
				c[i][t[i]] += fmin;
			}
			maxflow += fmin;
		}
	}
	/*
	for(int i = 1; i <= n; ++i)
	{
		for(int j = 1; j <= n; ++j)
		{
			os << c[i][j] << ' ';
		}
		os << '\n';
	}*/
	//os << '\n';
	return maxflow;
}

int main()
{
	is >>n >> m;
	int x, y, z;
	g = vector<vector<int>>(n+1);
	for(int i = 1; i <= m; ++i)
	{
		is >> x >> y >> z;
		g[x].push_back(y);
		g[y].push_back(x);
		c[x][y] = z;
		
	}
	//os << MaxFlow(1, n);
/*
	for(int i = 1; i <= n; ++i)
	{
		for(int j = 1; j <= n; ++j)
		{
			os << c[i][j] << ' ';
		}
		os << '\n';
	}
	*/
	//os << '\n';
	os << MaxFlow(1,n);
	is.close();
	os.close();
	return 0;
}