Cod sursa(job #2671131)

Utilizator bem.andreiIceman bem.andrei Data 11 noiembrie 2020 15:18:12
Problema Flux maxim de cost minim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include<bits/stdc++.h>

#define N 800000
#define INF 2000000000
using namespace std;
ifstream r("fmcm.in");
ofstream wr("fmcm.out");
int sol, n, m, i, s, d, u, w, *v, cp;
int fl, cs, cu, cm[351], first, last;
int co[N], mark[351], dad[351], vec[351][351], gr[351];
short int c[351][351], C[351][351];
void flux()
{
	for(;;)
	{
		for(i = 1; i <= n; i++){
            cm[i] = INF;
		}
		cm[s] = 0; first = last = 1; co[1] = s; mark[s] = 1;
		while(first <= last)
		{
			u = co[first++];
			cu = cm[u];
			mark[u] = 0;

			for(v = vec[u]; *v; v++){
				if(c[u][*v] && cu + C[u][*v] < cm[*v])
				{
					cm[*v] = cu + C[u][*v];
					dad[*v] = u;
					if(!mark[*v])
					{
						mark[*v] = 1; co[++last] = *v;
					}
				}
			}
		}
		if(cm[d] == INF){
                return;
		}
		fl = INF;
		for(u = d; u != s; u = dad[u]){
            fl = (fl < c[dad[u]][u]) ? fl : c[dad[u]][u];
		}
		for(u = d; u != s; u = dad[u])
		{
			c[dad[u]][u] -= fl;
			c[u][dad[u]] += fl;
		}
		sol += fl * cm[d];
	}
}

int main()
{
	v = new int;
	r>>n>>m>>s>>d;
	for(i = 1; i <= m; i++)
	{
		r>>u>>w>>cp>>cs;
		c[u][w] = cp;
		C[u][w] = cs;
		C[w][u] = -cs;
		vec[u][gr[u]++] = w;
		vec[w][gr[w]++] = u;
	}
	flux();
	wr<<sol;
	return 0;
}