Pagini recente » Cod sursa (job #11679) | Cod sursa (job #2858637) | Cod sursa (job #3131983) | Cod sursa (job #2140230) | Cod sursa (job #1051513)
#include <fstream>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
int cap[1024][1024],pred[1024],q[1024];
vector <int> vec[1024];
void bfs(int s,int t)
{
int start=0,avans=0;
q[avans++]=s;
pred[s]=-2;
while(avans>start && pred[t]==-1)
for(int u=q[start++],i=0,v;i<vec[u].size();i++)
{
v=vec[u][i];
if(pred[v]==-1 && cap[u][v])
q[avans++]=v,pred[v]=u;
}
}
int dinic(int n,int s,int t){
int fl=0;
while(1)
{
memset(pred,-1,sizeof(pred));
bfs(s,t);
if(pred[t]==-1) break;
for(int z=1;z<=n;z++)
if(cap[z][t] && pred[z]!=-1)
{
int capmin=cap[z][t];
for(int v=z,u=pred[v];u>0;v=u,u=pred[v])
capmin=min(capmin,cap[u][v]);
if(!capmin) continue;
cap[z][t]-=capmin;cap[t][z]+=capmin;
for(int v=z,u=pred[v];u>=0;v=u,u=pred[v])
{ cap[u][v]-=capmin;cap[v][u]+=capmin;}
fl+=capmin;
}
}
return fl;
}
int main()
{
int n,s,t,m;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
f>>n>>m;
s=1;t=n;
for(int i=0;i<m;i++)
{
int u,v,c;
f>>u>>v>>c;
cap[u][v]+=c;
vec[u].push_back(v);
vec[v].push_back(u);
}
g<<dinic(n,s,t);
return 0;
}