Pagini recente » Cod sursa (job #342188) | Cod sursa (job #545008) | Borderou de evaluare (job #2035331) | Cod sursa (job #1121896) | Cod sursa (job #2886715)
#include<bits/stdc++.h>
using namespace std;
const int NMAX=1e3+5;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int cap[NMAX][NMAX],flow[NMAX][NMAX];
bool adj[NMAX][NMAX];
vector<int> edg[NMAX];
int layer[NMAX],ptr[NMAX],s,t;
int dfs(int u, int f){
if(u==t || f==0) return f;
for(int &i=ptr[u];i<edg[u].size();i++){
int v=edg[u][i];
if(layer[v]==layer[u]+1 && flow[u][v]<cap[u][v]){
int new_flow=dfs(v,min(f,cap[u][v]-flow[u][v]));
if(new_flow){
flow[u][v]+=new_flow;
flow[v][u]-=new_flow;
return new_flow;
}
}
}
return 0;
}
int main(){
int n,m,ans=0;
fin>>n>>m;
for(int i=0;i<m;i++){
int x,y,c;
fin>>x>>y>>c;
cap[x][y]+=c;
adj[x][y]=adj[y][x]=1;
}
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(adj[i][j]) edg[i].push_back(j);
s=1,t=n;
for(;;){
for(int i=1;i<=n;i++)
layer[i]=-1,ptr[i]=0;
layer[s]=0;
queue<int> q;
q.push(s);
while(!q.empty()){
for(auto it : edg[q.front()]){
if(flow[q.front()][it]<cap[q.front()][it] && layer[it]==-1){
layer[it]=layer[q.front()]+1;
q.push(it);
}
}
q.pop();
}
if(layer[t]==-1) break;
int iter=0;
int new_flow=1;
while((new_flow=dfs(s,INT_MAX))){
iter++;
ans+=new_flow;
}
if(iter==0) break;
}
fout<<ans;
return 0;
}