Pagini recente » Cod sursa (job #1203623) | Cod sursa (job #17815) | Cod sursa (job #2277242) | Cod sursa (job #3194902) | Cod sursa (job #2900851)
#include <bits/stdc++.h>
using namespace std;
#define cin fin
#define cout fout
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
struct edge{
int from, to, flow, cap;
};
struct Dinic{
int n;
int s, t;
vector<int> v;
vector<int> level, ptr;
vector<edge> edges;
vector<vector<int>> out;
Dinic(int _n, int _s, int _t){
n=_n, s=_s, t=_t;
v.resize(n+1);
level.resize(n+1);
ptr.resize(n+1);
out.resize(n+1);
}
void addEdge(int from, int to, int cap) {
out[from].push_back(edges.size());
edges.push_back({from, to, 0, cap});
out[to].push_back(edges.size());
edges.push_back({to, from, 0, 0});
}
bool bfs(){
queue<int> q;
q.push(s);
fill(level.begin(), level.end(), -1);
level[s]=0;
fill(ptr.begin(), ptr.end(), 0);
while(!q.empty()){
int cr=q.front();
q.pop();
for(auto it:out[cr]){
int ncr=edges[it].to;
if((level[ncr]!=-1)||(edges[it].cap==edges[it].flow)) continue;
level[ncr]=level[cr]+1;
q.push(ncr);
}
}
return level[t]!=-1;
}
int dfs(int x, int sent=1e9){
if(sent==0) return 0;
if(x==t) return sent;
for(int& cr=ptr[x];cr<out[x].size();cr++){
int cre=out[x][cr];
auto& e=edges[cre];
if((level[e.to]!=level[e.from]+1)) continue;
int newSent=min(sent, e.cap-e.flow);
int actuallySent=dfs(e.to, newSent);
if(actuallySent!=0){
e.flow+=actuallySent;
edges[cre^1].flow-=actuallySent;
return actuallySent;
}
}
return 0;
}
int getFlow(){
int flow=0;
while(bfs()){
int sent;
while(sent=dfs(s)) flow+=sent;
}
return flow;
}
};
int main(){
int n, m;
cin>>n>>m;
Dinic flowNet(n, 1, n);
for(int i=1;i<=m;++i){
int a, b, c;
cin>>a>>b>>c;
flowNet.addEdge(a, b, c);
}
cout<<flowNet.getFlow()<<"\n";
return 0;
}