Pagini recente » Cod sursa (job #2297689) | Cod sursa (job #1808163) | Cod sursa (job #1946951) | Cod sursa (job #1167867)
#include <stdio.h>
#include <vector>
#include <deque>
#include <string.h>
using namespace std;
FILE *f,*g;
vector <int> v[1005];
deque <int> q;
int n,m,c1,c[1005][1005],t[1005],i,s,d,min1,flux,fl[1005][1005],i1;
int bf ()
{
memset (t,0,sizeof (t));
int nod;
t[1]=-1;
q.erase (q.begin (),q.end());
q.push_back (s);
while (! q.empty())
{
nod=q.front ();
for (int j=0;j<v[nod].size ();j++)
{
int x=v[nod].at (j);
if (c[nod][x]-fl[nod][x]>0 && t[x]==0)
{
q.push_back (x);
t[x]=nod;
if (x==d) return 1;
}
}
q.pop_front ();
}
return 0;
}
int main()
{f=fopen ("maxflow.in","r");
g=fopen ("maxflow.out","w");
fscanf (f,"%d%d",&n,&m);
int x,y;
s=1;
d=n;
for (i=1;i<=m;i++)
{
fscanf (f,"%d%d%d",&x,&y,&c1);
c[x][y]=c1;
v[x].push_back(y);
v[y].push_back (x);
}
while (bf())
{
for (i1=1;i1<=n;i1++)
if (c[i1][d]-fl[i1][d]>0 && (t[i1]!=0 || i1==1))
{
min1=c[i1][d]-fl[i1][d];
i=i1;
while (i!=s)
{
if (c[t[i]][i]-fl[t[i]][i]<min1) min1 =c[t[i]][i]-fl[t[i]][i];
i=t[i];
}
flux+=min1;
i=i1;
fl[i1][d]+=min1;
fl[d][i1]-=min1;
while (i!=s)
{
fl[t[i]][i]+=min1;
fl[i][t[i]]-=min1;
i=t[i];
}
}
}
fprintf (g,"%d",flux);
return 0;
}