Pagini recente » Cod sursa (job #159431) | Cod sursa (job #695785) | Cod sursa (job #268158) | Cod sursa (job #2893906) | Cod sursa (job #1166941)
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;
#define maxn 1005
vector <int> muchii[maxn];
vector <int> analyze,path;
vector <pair<int,int> > v;
int m[maxn][maxn];
int n,nm,i,x,y,c,b,now,i1,to,cap,inod,mn,last,flux,inow,ito;
int inside[maxn];
int main(void)
{
FILE * f;
f=fopen("maxflow.in","r");
ofstream g("maxflow.out");
fscanf(f,"%d%d",&n,&nm);
for (i=1;i<=nm;i++)
{
fscanf(f,"%d%d%d",&x,&y,&c);
muchii[x].push_back(y);
m[x][y]=c;
muchii[y].push_back(x);
m[y][x]=0;
}
b=1;
while (b==1)
{
b=0;
analyze.clear();
v.clear();
v.push_back(make_pair(1,0));
memset(inside,0,sizeof(inside));
inside[1]=1;
for (i=0;i<v.size();i++)
{
now=v[i].first;
for (i1=0;i1<muchii[now].size();i1++)
{
to=muchii[now][i1];
cap=m[now][to];
if (cap!=0)
{
if (to==n)
analyze.push_back(i);
else
if (inside[to]==0)
{
v.push_back(make_pair(to,i));
inside[to]=1;
}
}
}
}
for (i=0;i<analyze.size();i++)
{
inod=analyze[i];
path.clear();
path.push_back(inod);
now=v[inod].first;
mn=m[now][n];
while (inod>0)
{
now=v[inod].first;
inod=v[inod].second;
last=v[inod].first;
if (m[last][now]==0)
inod=-1;
else
{
mn=min(mn,m[last][now]);
path.push_back(inod);
}
}
if (inod==0)
{
flux=flux+mn;
b=1;
for (i1=path.size()-1;i1>=1;i1--)
{
inow=path[i1];
now=v[inow].first;
ito=path[i1-1];
to=v[ito].first;
m[now][to]-=mn;
m[to][now]+=mn;
}
}
}
}
g<<flux;
g.close();
return 0;
}