Cod sursa(job #2958370)

Utilizator Tudose_StefanTudose Alexandru Stefan Tudose_Stefan Data 26 decembrie 2022 12:14:58
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#include <bits/stdc++.h>

using namespace std;

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

int cty[1001][1001], fl[1001][1001], tata[1001];
vector <vector<int>> adjL;
vector  <int> viz;
int n, m, i, nr1, nr2, nr3, flow, minn, j;

int BFS(){
	queue<int> q;
	q.push(1);
	viz.assign(n+1, 0);
	while(!q.empty()){
		nr1 = q.front();
		q.pop();
		if(nr1 == n)
			break;
		viz[nr1]=1;
		for(auto &i : adjL[nr1]){
			if (!viz[i] && fl[nr1][i] != cty[nr1][i]){
				viz[i] = 1;
				tata[i] = nr1;
				q.push(i);
			}
		}
	}
	return viz[n];
}


int main(){
  	fin >>n >> m;
  	adjL.assign(n+1, vector<int>());
  	for(i = 0; i <m; ++i){
  		fin >> nr1 >> nr2 >> nr3;
  		adjL[nr1].push_back(nr2);
  		adjL[nr2].push_back(nr1);
  		cty[nr1][nr2] = nr3;
  	}
  	flow = 0;
  	while(BFS()){
  		for(auto &i:adjL[n]){
  			minn = INT_MAX;
  			tata[n] = i;
  			j = n;
  			while(j > 1){
  				minn = min(minn, cty[tata[j]][j] - fl[tata[j]][j]);
  				j = tata[j];
  			}
  			for (j = n; j> 1; j = tata[j]){
  				fl[tata[j]][j] += minn;
  				fl[j][tata[j]] -= minn;
  			}
  			flow += minn;
  		}
  	}
  	fout << flow << '\n';

	return 0;
}