Pagini recente » Cod sursa (job #1865330) | Cod sursa (job #768157) | Cod sursa (job #1961976) | Cod sursa (job #418089) | Cod sursa (job #2677638)
#include<bits/stdc++.h>
using namespace std;
struct Dinic{
struct Edges{
int x, c, f;
int rev;
};
vector<vector<Edges>> gr;
vector<int> lvl;
vector<int> ind;
int S, D;
int N;
Dinic(int n, int _s, int _d) : gr(n + 1), lvl(n + 1), ind(n+1), S(_s), D(_d), N(n){
}
bool bfs_level(){
for(int i=1;i<=N;i++)
lvl[i] = -1;
queue<int> q;
q.push(S);
lvl[S] = 0;
while(q.size()){
int nod = q.front();
q.pop();
for(auto x:gr[nod]){
if(x.f < x.c && lvl[x.x] == -1){
lvl[x.x] = 1+ lvl[nod];
q.push(x.x);
}
}
}
if(lvl[D] == -1)
return false;
return true;
}
int dfs_flow(int nod,int cflow){
if(cflow == 0 || nod == D)
return cflow;
for(ind[nod];ind[nod] < gr[nod].size(); ind[nod]++){
auto &e = gr[nod][ind[nod]];
if(lvl[e.x] != lvl[nod] + 1)
continue;
int fl = dfs_flow(e.x, min(cflow, e.c - e.f));
if(fl > 0){
e.f += fl;
gr[e.x][e.rev].f -= fl;
return fl;
}
}
return 0;
}
void AddEdge(int x, int y,int cap){
int nrx = gr[x].size();
int nry = gr[y].size();
gr[x].push_back({y, cap, 0, nry});
gr[y].push_back({x, 0, 0, nrx});
}
int GetFlow(){
int mflow = 0;
while(bfs_level()){
for(int i=1;i<=N;i++)
ind[i] = 0;
while(int fl = dfs_flow(S, INT_MAX))
mflow += fl;
}
return mflow;
}
};
int main()
{
FILE*fin,*fout;
fin=fopen("maxflow.in","r");
fout=fopen("maxflow.out","w");
int n,m;
fscanf(fin,"%d%d",&n,&m);
Dinic network(n,1,n);
for(int i=1;i<=m;i++){
int x,y,z;
fscanf(fin,"%d%d%d",&x,&y,&z);
network.AddEdge(x,y,z);
}
fprintf(fout,"%d",network.GetFlow());
return 0;
}