Pagini recente » Cod sursa (job #1897388) | Cod sursa (job #1989830) | Cod sursa (job #1061963) | Cod sursa (job #725609) | Cod sursa (job #3203794)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
vector <int> G[1002];
int t[1002];
int n;
struct edge{
int u,v,cap,f = 0;
edge(int _u, int _v, int _cap){
u = _u;
v = _v;
cap = _cap;
}
};
vector <edge> edges;
vector <int> level;
vector <int> ptr;
queue <int> q;
bool bfs(){
q.push(1);
while(!q.empty()){
int u = q.front();
for(auto x : G[u]){
if(edges[x].cap - edges[x].f < 1) continue;
if(level[edges[x].v] != -1) continue;
level[edges[x].v] = level[u] + 1;
q.push(edges[x].v);
}
q.pop();
}
return level[n] != -1;
}
int dfs(int nod, int ftemp){
if(!ftemp) return 0;
if(nod == n) return ftemp;
for(int &p = ptr[nod]; p < G[nod].size(); p++){
int id = G[nod][p];
int x = edges[id].v;
if(level[nod] + 1 != level[x] || edges[id].cap - edges[id].f < 1) continue;
int t = dfs(x, min(ftemp, edges[id].cap - edges[id].f));
if(!t) continue;
edges[id].f += t;
edges[id ^ 1].f -= t;
return t;
}
return 0;
}
int dinic(){
int rez = 0;
while(1){
fill(level.begin(), level.end(), -1);
level[1] = 0;
if(!bfs()) break;
fill(ptr.begin(), ptr.end(), 0);
while(int t = dfs(1, 1e9)) rez += t;
}
return rez;
}
int main()
{
int i,m,u,v,c,id = 0;
fin >> n >> m;
for(i = 1; i <= m; i++){
fin >> u >> v >> c;
G[u].push_back(id);
G[v].push_back(id + 1);
edges.push_back(edge(u,v,c));
edges.push_back(edge(v,u,0));
id += 2;
}
level.resize(n + 1);
ptr.resize(n + 1);
fout << dinic();
return 0;
}