Pagini recente » Cod sursa (job #1633383) | Cod sursa (job #719683) | Cod sursa (job #1796182) | Cod sursa (job #796563) | Cod sursa (job #2918746)
#include <bits/stdc++.h>//Dinic's algorithm
using namespace std;
ifstream fin ("maxflow.in");
ofstream fout("maxflow.out");
const int dim=1009,inf=1e9;
vector<int>adj[dim];
int n,m;
int level[dim],ptr[dim];
int flow[dim][dim],capacity[dim][dim];
void bfs(){
queue<int>q;
q.push(1);
while(!q.empty()){
int x=q.front();
q.pop();
for(int y:adj[x]){
if(level[y]==-1&&capacity[x][y]-flow[x][y]>0){
level[y]=level[x]+1;
q.push(y);
}
}
}
}
int dfs(int x,int pushed){
if(pushed==0){
return 0;
}
if(x==n){
return pushed;
}
for(int& i=ptr[x];i<adj[x].size();i++){
int y=adj[x][i];
if(level[x]+1==level[y] && capacity[x][y]-flow[x][y]>0){
int f=dfs(y,min(pushed,capacity[x][y]-flow[x][y]));
if(f!=0){
flow[x][y]+=f;
flow[y][x]-=f;
return f;
}
}
}
return 0;
}
signed main(){
fin>>n>>m;
for(int i=1;i<=m;i++){
int x,y,c;
fin>>x>>y>>c;
adj[x].push_back(y);
adj[y].push_back(x);
capacity[x][y]=c;
//capacity[y][x]=0;
}
int max_flow=0;
while(true){
for(int i=1;i<=n;i++){
level[i]=-1;
ptr[i]=0;
}
level[1]=0;
bfs();
if(level[n]==-1){
break;
}
int pushed=0;
while(pushed=dfs(1,inf)){
max_flow+=pushed;
}
}
fout<<max_flow;
}