Pagini recente » Cod sursa (job #1180663) | Cod sursa (job #222987) | Cod sursa (job #2785596) | Cod sursa (job #2405211) | Cod sursa (job #2267357)
#include <iostream>
#include <fstream>
#define nmax 1024
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int n,m,tata[nmax],cap[nmax][nmax],Q[nmax],f[nmax+5][nmax+5],flow=0;
bool viz[nmax];
struct nod
{
int info;
nod *urm;
}*v[nmax+5],*d,*e[nmax+5];
int minv(int a, int b)
{
return a<b?a:b;
}
bool bfs(bool x)
{
Q[0]=Q[1]=1;
viz[1]=x;
nod *c;
for(int i=1;i<=Q[0];i++)
{
c=v[Q[i]];
if(Q[i]==n)continue;
while(c->urm)
{
c=c->urm;
if(viz[c->info]!=x && cap[Q[i]][c->info]-f[Q[i]][c->info]>0)
{
viz[c->info]=x;
Q[++Q[0]]=c->info;
tata[c->info]=Q[i];
}
}
}
return viz[n]==x;
}
void flux()
{
bool gg=1;
nod *ee;
int tati,fmin=0x3f3f3f3f;
while(bfs(gg))
{
ee=v[n];
while(ee->urm)
{
fmin=0x3f3f3f3f;
ee=ee->urm;
if(cap[ee->info][n]==f[ee->info][n] || viz[ee->info]==!gg)continue;
tata[n]=ee->info;
for(int i=n;i!=1;i=tata[i])
fmin=minv(fmin,cap[tata[i]][i]-f[tata[i]][i]);
for(int i=n;i!=1;i=tata[i])
f[tata[i]][i]+=fmin,f[i][tata[i]]+=fmin;
flow+=fmin;
}
gg=!gg;
}
}
int main()
{
int x,y,z;
fin>>n>>m;
for(int i=1;i<=n;i++)
{
v[i]=new nod;
v[i]->info=i;
v[i]->urm=0;
}
while(fin>>x>>y>>z)
{
if(!v[x]->urm)
{
d=new nod;
d->urm=0;
d->info=y;
v[x]->urm=d;
e[x]=d;
}
else
{
d=new nod;
d->urm=0;
d->info=y;
e[x]->urm=d;
e[x]=d;
}
if(!v[y]->urm)
{
d=new nod;
d->urm=0;
d->info=x;
v[y]->urm=d;
e[y]=d;
}
else
{
d=new nod;
d->urm=0;
d->info=x;
e[y]->urm=d;
e[y]=d;
}
cap[x][y]=cap[y][x]=f[y][x]=z;
}
flux();
fout<<flow<<"\n";
return 0;
}