Cod sursa(job #2979275)

Utilizator BadHero112Ursu Vasile BadHero112 Data 14 februarie 2023 21:19:20
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <bits/stdc++.h>
using ll=long long;
#define S second
#define F first
#define endl '\n'
#define spid ios_base::sync_with_stdio(false);cin.tie(NULL);
const int mod=1e9+7;
const double pi=3.14159265359;
const int maxn=501;
using namespace std;

ll n,m,flag=1;
vector<vector<int>> A(maxn,vector<int>());
ll cap[maxn][maxn];
ll L[maxn],ans=0,ptr[maxn];

void build_L(){
	int chk[maxn];
	for(int i=0;i<n;i++)chk[i]=0;
	queue<int> Q;
	Q.push(0);
	while(Q.size()){
		int i=Q.front();
		chk[i]=1;
		Q.pop();
		for(int j=0;j<A[i].size();j++){
			if(chk[A[i][j]]||!cap[i][A[i][j]])continue;
			L[A[i][j]]=L[i]+1;
			Q.push(A[i][j]);
		}
	}
	if(L[n-1]==-1)flag=0;
}

ll dfs(int i,ll pushed){
	if(pushed==0)return 0;
	if(i==n-1)return pushed;
	for(ll& j=ptr[i];j<A[i].size();j++){
		if(L[i]==L[A[i][j]]-1&&cap[i][A[i][j]]>0){
			ll tr=dfs(A[i][j],min(pushed,cap[i][A[i][j]]));
			if(tr==0)continue;
			cap[i][A[i][j]]-=tr;
			cap[A[i][j]][i]+=tr;
			return tr;
		}
		
	}
	return 0;
}

void get_blocking_flow(){
	for(int i=0;i<n;i++){
		L[i]=-1;
	}
	L[0]=0;
	build_L();
	if(flag){
		for(int i=0;i<n;i++)ptr[i]=0;
		ll flow=1e18;
		while(flow){
			flow=dfs(0,1e18);
			ans+=flow;
		}
	}
}

int main(){
	ifstream cin("maxflow.in");
	ofstream cout("maxflow.out");
	cin>>n>>m;
	for(int i=0;i<m;i++){
		ll c1,c2,c3;
		cin>>c1>>c2>>c3;
		c1--;
		c2--;
		if(c2==0||c1==n-1)continue;
		if(cap[c1][c2]==0){
			A[c1].push_back(c2);
			A[c2].push_back(c1);
		}
		cap[c1][c2]+=c3;
	}
	while(flag){
		get_blocking_flow();
	}
	cout<<ans<<endl;
}