Pagini recente » Cod sursa (job #2581001) | Cod sursa (job #1368190) | Cod sursa (job #1015405) | Cod sursa (job #1093507) | Cod sursa (job #1405579)
#include <fstream>
#include <limits>
#include <vector>
#include <queue>
#include <algorithm>
#define INF numeric_limits<int>::max()
#define pb push_back
using namespace std;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
vector< vector<int> > a;
queue<int> q;
int cap[1002][1002],flow[1002][1002],n,m,pre[1002],t[1002],k,s,d,maxflow;
//.......................
bool bfs()
{
k=0;
q.push(s);
for(int i=1;i<=n;i++)pre[i]=0;
pre[s]=s;
while(!q.empty())
{
int x=q.front();q.pop();
for(vector<int>::iterator i=a[x].begin();i!=a[x].end();i++)
if(cap[x][*i]-flow[x][*i]>0 && pre[*i]==0)
{
if(*i==d)
{
t[++k]=x;
continue;
}
pre[*i]=x;
q.push(*i);
}
}
return k;
}
//.................
int main()
{
in>>n>>m;
a=vector< vector<int> > (n+1);
for(;m;m--)
{
int x,y,z;
in>>x>>y>>z;
a[x].pb(y);
a[y].pb(x);
cap[x][y]=z;
}
//.....................
for(s=1,d=n;bfs();)//sursa, destinatie
{
for(int i=1;i<=k;i++)
{
int mx=INF;
pre[d]=t[i];
//.................
for(int x=d;x!=pre[x];x=pre[x])
mx=min(cap[pre[x]][x]-flow[pre[x]][x],mx);
//..................
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;
}