Cod sursa(job #2406525)

Utilizator Dobricean_IoanDobricean Ionut Dobricean_Ioan Data 15 aprilie 2019 20:24:02
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 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;
	}
	fout << MaxFlow(1,n) << "\n";
}


bool Bf( int source, int snik) {

	 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]);  
 
            for (int i = sink ; i != source ; i = t[i]) 
            {
                C[t[i]][i] -= fmin;
                C[i][t[i]] += fmin;
            }
            maxflow += fmin;
        }
	}		
    return maxflow;
}