Pagini recente » Cod sursa (job #306903) | Cod sursa (job #768243) | Cod sursa (job #2622506) | Cod sursa (job #3223293) | Cod sursa (job #1947978)
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <algorithm>
#include <set>
#include <map>
#include <cmath>
#include <cstring>
using namespace std;
#define fi first
#define se second
typedef long long LL;
typedef long double LD;
int N,M,C[1010][1010],T[1010],F[1010][1010],q[1010],K; bool v[1010];
vector<int> g[1010];
bool bfs(){
memset(v,0,sizeof(v));
memset(T,0,sizeof(T));
K=1,q[1]=1,v[1]=1;
int i,nod;
for (i=1; i<=K; i++){
nod=q[i];
for (int next : g[nod])
if (!v[next] && F[nod][next]<C[nod][next]){
if (next!=N) q[++K]=next;
v[next]=1;
T[next]=nod;
}
}
return v[N];
}
int main(){
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
fin >> N >> M;
int i,c,x,y;
for (i=1; i<=M; i++){
fin >> x >> y >> c;
g[x].push_back(y);
C[x][y]+=c;
g[y].push_back(x);
}
int flow=0;
while (bfs()){
for (int nd : g[N]){
if (!v[nd] || F[nd][N]==C[nd][N]) continue;
T[N]=nd;
int fmin=(1<<30),nod;
for (nod=N; nod!=1; nod=T[nod])
fmin=min(fmin,C[T[nod]][nod]-F[T[nod]][nod]);
flow+=fmin;
for (nod=N; nod!=1; nod=T[nod]){
F[T[nod]][nod]+=fmin;
F[nod][T[nod]]-=fmin;
}
}
}
fout << flow << "\n";
return 0;
}