Cod sursa(job #639207)

Utilizator JBaccountCatalin JBaccount Data 22 noiembrie 2011 19:22:48
Problema Flux maxim de cost minim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.95 kb
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <queue>
#include <vector>

using namespace std;

#define LL long long
#define PB push_back
#define NM 510
#define inf 1000000000

LL flow;
int C[NM][NM], F[NM][NM], D[NM][NM], s, d, N, M;
vector <int> G[NM];

int blf()
{
	int inside[NM], fat[NM], dist[NM];
	queue <int> Q;
	memset (inside, 0, sizeof(inside));
	for (int i = 1; i <= N; ++i) dist[i] = inf;
	
	Q.push(s);
	inside[s] = 1;
	dist[s] = 0;
	fat[s] = 0;
	while (!Q.empty())
	{
		int node = Q.front();
		Q.pop();
		inside[node] = 0;
		
		for (vector<int>::iterator it = G[node].begin(); it != G[node].end(); ++it)
		{
			int nnode = *it;
			if (C[node][nnode] == F[node][nnode]) continue;
			
			if (dist[node] + D[node][nnode] < dist[nnode])
			{
				dist[nnode] = dist[node] + D[node][nnode];
				fat[nnode] = node;
				if (!inside[nnode])
				{
					Q.push(nnode);
					inside[nnode] = 1;
				}	
			}	
		}	
	}	
	
	/*
	for (int i = 1; i <= N; ++i) printf ("%d ", dist[i]);
	printf ("\n");
	*/
	
	if (dist[d] == inf) return 0;
	
	int node = d;
	int flowadd = inf;
	while (fat[node])
	{
		int nnode = fat[node];
		flowadd = min(flowadd, C[nnode][node] - F[nnode][node]);
		node = nnode;
	}	
	node = d;
	while (fat[node])
	{
		int nnode = fat[node];
		F[nnode][node] += flowadd;
		F[node][nnode] -= flowadd;
		node = nnode;
	}	
	flow += (LL)dist[d]*flowadd;
	return 1;
}

int main()
{
	freopen ("fmcm.in", "r", stdin);
	freopen ("fmcm.out", "w", stdout);
	
	scanf ("%d %d %d %d", &N, &M, &s, &d);
	
	for (int i = 1; i <= M; ++i)
	{
		int a, b, c, cs;
		scanf ("%d %d %d %d", &a, &b, &c, &cs);
		
		G[a].PB(b);
		G[b].PB(a);
		C[a][b] = c;
		D[a][b] = cs;
		D[b][a] = -cs;
	}	
	/*
	for (int i = 1; i <= N; ++i)
	{
		for (int j = 1; j <= N; ++j) printf ("%d ", C[i][j]);
		printf ("\n");
	}	
	*/
	while (blf());
	
	printf ("%lld", flow);
	
	return 0;
}