Pagini recente » Cod sursa (job #3197785) | Cod sursa (job #1247091) | Cod sursa (job #2068044) | Cod sursa (job #1648210) | Cod sursa (job #3039664)
#include <bits/stdc++.h>
#define N 1011
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
struct muchie
{
int nod,cap,flow,rev;
};
vector <muchie> v[N];
int lvl[N],n;
bool bfs()
{
queue <int> q;
memset(lvl,0,sizeof(lvl));
q.push(1);
lvl[1]=1;
while(!q.empty())
{
int k=q.front();
q.pop();
for(auto x=v[k].begin();x<v[k].end();x++)
{
muchie it=*x;
if(lvl[it.nod]==0 && it.flow<it.cap)
{
lvl[it.nod]=lvl[k]+1;
q.push(it.nod);
}
}
}
return lvl[n];
}
int dfs(int k,int flow,int next[])
{
if(k==n)
return flow;
for(;next[k]<v[k].size();next[k]++)
{
if(lvl[v[k][next[k]].nod]==lvl[k]+1 && v[k][next[k]].cap>v[k][next[k]].flow)
{
int curr_flow=min(flow,v[k][next[k]].cap-v[k][next[k]].flow);
int temp_flow=dfs(v[k][next[k]].nod,curr_flow,next);
if(temp_flow)
{
v[k][next[k]].flow+=temp_flow;
v[v[k][next[k]].nod][v[k][next[k]].rev].flow-=temp_flow;
return temp_flow;
}
}
}
}
int Dinic()
{
int total_flow=0;
while(bfs())
{
int *next=new int[n+1]{0};
while(int flow=dfs(1,2000000001,next))
total_flow+=flow;
delete[] next;
}
return total_flow;
}
int m,x,y,z,i;
int main()
{
f>>n>>m;
for(i=1;i<=m;i++)
{
f>>x>>y>>z;
v[x].push_back({y,z,0,(int)v[y].size()});
v[y].push_back({x,0,0,(int)v[x].size()});
}
g<<Dinic();
return 0;
}