Cod sursa(job #2630427)

Utilizator Leonard123Mirt Leonard Leonard123 Data 25 iunie 2020 17:23:19
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#include<bits/stdc++.h>
#define maxn 1005
#define maxf 1000000000
#define pb push_back
using namespace std;
vector <int> v[maxn];
int n,m,ant[maxn],tt[maxn],viz[maxn],flux[maxn][maxn],c[maxn][maxn];

void read(){
	cin>>n>>m;
	int x,y,z;
	while(m--){
		cin>>x>>y>>z;
		v[x].pb(y);
		v[y].pb(x);
		c[x][y]=z;
	}
}

int bfs(){
	memset(viz,0,sizeof(viz));
	ant[0]=ant[1]=viz[1]=1;
	for(int j=1; j<=ant[0]; j++){
		int nod=ant[j];
		if(nod==n)
			continue;
		for(int i=0; i<v[nod].size(); i++){
			int dest=v[nod][i];
			if(viz[dest]||c[nod][dest]==flux[nod][dest])	
				continue;
			ant[++ant[0]]=dest;
			tt[dest]=nod;
			viz[dest]=1;
		}
	}

	return viz[n];
}

void solve(){
	int Flux=0,flux_minim,nod;
	while(bfs())
		for(int i=0; i<v[n].size(); i++){
			nod=v[n][i];
			if(!viz[n] || c[nod][n]==flux[nod][n])
				continue;
			tt[n]=nod;
			flux_minim=maxf;
			for(int wh=n; wh!=1; wh=tt[wh])
				flux_minim=min(flux_minim, c[tt[wh]][wh]-flux[tt[wh]][wh]);
			if(flux_minim==0)
				continue;
			for(int wh=n; wh!=1; wh=tt[wh])
				flux[tt[wh]][wh]+=flux_minim,
				flux[wh][tt[wh]]-=flux_minim;
			Flux+=flux_minim;
		}
	cout<<Flux;
}

int main(){
	freopen("maxflow.in","r",stdin);
	freopen("maxflow.out","w",stdout);
	read();
	solve();
}