Cod sursa(job #2409890)

Utilizator alex2209alexPavel Alexandru alex2209alex Data 19 aprilie 2019 15:26:46
Problema Flux maxim de cost minim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include<fstream>
using namespace std;
ifstream f("fmcm.in");
ofstream g("fmcm.out");
//----------------------------------
//Globale
int sol,n,co[800001],ver[352],pre[352],v[352][352],S,D,*val;
short c[352][352],C[352][352];
//----------------------------------
//Functii
void citeste();
void flux();
//----------------------------------
int main()
{
	citeste();
	flux();
	return 0;
}
//----------------------------------
void flux()
{
    int d[352],cu;
	while(1)
	{
		for(int i = 1; i <= n; ++i)
            d[i] = 2000000000;
		d[S] = 0;
		int in = 1;
		int sf = 1;
		co[1] = S;
		ver[S] = 1;
		while(in <= sf)
		{
			int x = co[in++];
			cu = d[x];
			ver[x] = 0;
			for(val = v[x]; *val; ++val)
				if(c[x][*val] && cu + C[x][*val] < d[*val])
				{
					d[*val] = cu+C[x][*val];
					pre[*val] = x;
					if(!ver[*val])
					{
						ver[*val] = 1;
						co[++sf] = *val;
					}
				}
		}
		if(d[D] == 2000000000)
		{
		    g << sol;
			return;
		}
		int x = 2000000000;
		for(int i = D; i != S; i = pre[i])
            if(x > c[pre[i]][i])
                x = c[pre[i]][i];
		for(int i = D; i != S; i = pre[i])
		{
			c[pre[i]][i] -= x;
			c[i][pre[i]] += x;
		}
		sol += x * d[D];
	}
}
//----------------------------------
void citeste()
{
	val = new int;
	int m;
	int ap[352] = {0};
	f >> n >> m >> S >> D;
	for(int i = 1; i <= m; ++i)
	{
		int x,y,a,b;
		f >> x >> y >> a >> b;
		c[x][y] = a;
		C[x][y] = b;
		C[y][x] = -b;
		v[x][ap[x]++] = y;
		v[y][ap[y]++] = x;
	}
}