Pagini recente » Cod sursa (job #232053) | Cod sursa (job #2272491) | Cod sursa (job #55554) | Cod sursa (job #372775) | Cod sursa (job #1864043)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
int n,m;
struct graf
{
int vecin;
int cost;
struct graf *urm;
}*l[1004],*actual;
bool viz[1001];
int c[1001][1001];//matricea costurilor
int p[1001]; // parinti
int coada[1001];
int flow;
int minim(int a,int b)
{
if(a<b)
return a;
return b;
}
void actualizare(int st,int dr)
{
int mini=2000000000;
int aux=dr;
while(aux>st)
{
mini=minim(mini,c[p[aux]][aux]);
aux=p[aux];
}
flow+=mini;
aux=dr;
while(aux>st)
{
c[p[aux]][aux]-=mini;
c[aux][p[aux]]+=mini;
aux=p[aux];
}
}
int bfs(int st,int dr)
{
for(int i=1;i<=n;i++)
viz[i]=0;
int inc,sf;
inc=sf=1;
int nod=1;
coada[inc]=st;
bool ok=0;
while(inc<=sf)
{
nod=coada[inc];
inc++;
for(graf *actual=l[nod];actual!=NULL;actual=actual->urm)
{
if(viz[actual->vecin]==0&&c[nod][actual->vecin]>0)
{
p[actual->vecin]=nod;
if(actual->vecin==dr){
actualizare(st,dr);
ok=1;
}
else{
sf++;
coada[sf]=actual->vecin;
viz[actual->vecin]=1;
}
}
}
}
if(ok==1)
return 1;
else
return 0;
}
int main()
{
f>>n>>m;
int i,x,y,costuri;
for(i=1;i<=m;i++)
{
f>>x>>y>>costuri;
c[x][y]=costuri;
actual=new graf;
actual->cost=costuri;
actual->vecin=y;
actual->urm=l[x];
l[x]=actual;
actual=new graf;
actual->cost=costuri;
actual->vecin=x;
actual->urm=l[y];
l[y]=actual;
}
while(bfs(1,n))
{
}
g<<flow;
return 0;
}