Pagini recente » Cod sursa (job #749540) | Cod sursa (job #310225) | Istoria paginii runda/matrice_bfs_dfs | Cod sursa (job #2007686) | Cod sursa (job #1685909)
#include <bits/stdc++.h>
#define mp make_pair
#define pb push_back
#define INF numeric_limits<int>::max()
#define int64 long long
using namespace std;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
vector< vector<int> > adj;
queue<int> Q;
int cap[1024][1024],flow[1024][1024],n,m,S,D,pre[1024],k,R[1024];
bool bfs()
{
k=0;
for(int i=1;i<=n;i++)
pre[i]=0;
pre[S]=S;
Q.push(S);
while(!Q.empty())
{
int x=Q.front();
Q.pop();
for(auto it: adj[x])
if(cap[x][it]>flow[x][it] && pre[it]==0)
{
if(it==D)
R[++k]=x;
else{
Q.push(it);
pre[it]=x;
}
}
}
return (k!=0);
}
int main()
{
in>>n>>m;
adj=vector< vector<int> > (n+1);
for(;m;m--)
{
int x,y,z;
in>>x>>y>>z;
adj[x].pb(y);
adj[y].pb(x);
cap[x][y]=z;
}
S=1;
D=1;
int maxflow=0;
while(bfs()==true)
{
for(int i=1;i<=k;i++)
{
int mx=INF;
pre[D]=R[i];
for(int x=D;x!=pre[x];x=pre[x])
mx=min(mx,cap[ pre[x] ][x]-flow[ pre[x] ][x]);
for(int x=D;x!=pre[x];x=pre[x])
{
flow[ pre[x] ][x]+=mx;
flow[x][ pre[x] ]-=mx;
}
maxflow+=mx;
}
}
out<<maxflow<<'\n';
return 0;
}