Cod sursa(job #2696407)

Utilizator madalin_frFrincu Madalin madalin_fr Data 15 ianuarie 2021 20:45:44
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.43 kb
#include <fstream>
#include <iostream>
#include <vector>
#include <queue>
#include <set>
#define max_n 1024
constexpr auto inf = 0x3f3f3f3f;
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int i,j,n,s,t,m;
vector<int> tata;
vector<int> viz;
queue<int> coada;

struct arc
{
	int x;
	int y;
	int cp;
	int flx;
};

vector<arc> arce;

vector<int> graph[max_n];
int costs[max_n][max_n];
int flows[max_n][max_n];


int calc_flux_plus(int nod) // flux care iese din nod
{
	int flux = 0;
	for(i=1;i<=m;i++)
	{
		if(arce[i].x == nod)
		{
			flux += arce[i].flx;
		}
	}
	return flux;
}


int calc_flux_minus(int nod) // flux care intra in nod
{
	int flux = 0;
	for(i=1;i<=m;i++)
	{
		if(arce[i].y == nod)
		{
			flux += arce[i].flx;
		}
	}
	return flux;
}




bool construieste_s_t_lant_nesat_BF()
{
	for(i=1;i<=n;i++)
	{
		viz[i] = 0;
	}
	coada = queue<int>();	// gol
	coada.push(s);
	viz[s] = 1;
	while(!coada.empty())
	{
		const auto i = coada.front();
		coada.pop();
		if(i==n)
            continue;

		 for (auto neigh : graph[i])
        {
            if (costs[i][neigh] == flows[i][neigh] || viz[neigh])
                continue;

            viz[neigh] = 1;
            coada.push(neigh);
            tata[neigh] = i;
        }
    }
	return viz[t];
}




int main()
{
	fin >> n;
	fin >> m;
	tata.resize(n+1);
	viz.resize(n+1);
	for(i=1;i<=m;i++)
	{
	    int x,y,z;
	    fin >> x>>y>>z;
	    graph[x].push_back(y);
	    graph[y].push_back(x);
	    costs[x][y] += z;
	}
	s = 1;
	t = n;
    auto flow = 0;
    auto crt_flow = 0;
	while(construieste_s_t_lant_nesat_BF())
  {
        for (auto& node : graph[n])
        {
            if (flows[node][n] == costs[node][n] || !viz[node])
                continue;

            tata[n] = node;
            crt_flow = inf;
            for (auto prev_node = n; prev_node != 1; prev_node = tata[prev_node])
                crt_flow = min(crt_flow, costs[tata[prev_node]][prev_node] - flows[tata[prev_node]][prev_node]);

            if (crt_flow == 0)
                continue;

            for (auto prev_node = n; prev_node != 1; prev_node = tata[prev_node])
            {
                flows[tata[prev_node]][prev_node] += crt_flow;
                flows[prev_node][tata[prev_node]] -= crt_flow;
            }

            flow += crt_flow;
        }
  }
  fout << flow;
}