Cod sursa(job #2697648)

Utilizator mariamirabella2Bucur-Sabau Maria-Mirabela mariamirabella2 Data 19 ianuarie 2021 11:14:07
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.79 kb
#include <vector>
#include <cstring>
#include <queue>
#include <fstream>

using namespace std;

ifstream fin ("maxflow.in");
ofstream fout ("maxflow.out");

const int Dim = 1005;
const int Inf = 0x3f3f3f3f;

vector < int > G[Dim];
int n,m;
int v[Dim],C[Dim][Dim],t[Dim];
int MaxFlow(int source, int sink);

int main() {

	fin >> n >> m;
	int x,y,w;
	for ( int i = 1; i <= m; ++i) {

			fin >> x >> y >> w;
			G[x].push_back(y);
			G[y].push_back(x);
			C[x][y] += w; /// retinem costul intr-o matrice pentru a-l modifica mai usor
	}
	fout << MaxFlow(1,n) << "\n"; /// flux
}


bool Bf( int source, int snik) { /// facem lanturile si salvam tatii

	 memset(v,0,sizeof(v));
	 queue < int > Q;
     Q.push(source);
    v[source] = 1;

  while (!Q.empty())
    {
        int x = Q.front();
        Q.pop();
        if (x == snik)
            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[snik];
}

inline int MaxFlow(int source, int sink)
{
    int maxflow = 0, fmin;

    while (Bf(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]); /// minimul de pe lant

            for (int i = sink ; i != source ; i = t[i])
            {
                C[t[i]][i] -= fmin; /// scadem capacitatea ocupata
                C[i][t[i]] += fmin; /// adunam pe muchia inversa ca sa nu se strice bfs-ul
            }
            maxflow += fmin;
        }
	}
    return maxflow;
}