Pagini recente » Borderou de evaluare (job #1330369) | Cod sursa (job #477722) | Cod sursa (job #2199423) | Cod sursa (job #289195) | Cod sursa (job #288611)
Cod sursa(job #288611)
#include <fstream.h>
#define MAXN 1001
int a[MAXN][MAXN],n,m,c[MAXN][MAXN];
struct coada
{ int t,nod;};
coada q[MAXN+20];
int min(int a,int b)
{ return a<b?a:b;}
void rec(int x)
{
if(q[x].t)rec(q[x].t);
cout<<q[x].nod<<' ';
}
int main()
{int i,x,y,k,ok,p,u,viz[MAXN],minim,z;
//clrscr();
ifstream in("maxflow.in");
in>>n>>m;
for(i=1;i<=m;i++){in>>x>>y>>z;c[x][y]=z;}
in.close();
ok=1;
while(ok)
{
for(i=1;i<=n;i++)viz[i]=0;
viz[1]=1;
u=p=1;
q[1].t=0;
q[1].nod=1;
for(p=1;p<=u&&!viz[n];p++)
{
x=q[p].nod;
for(i=1;i<=n;i++)
if(c[x][i]&&!viz[i]&&a[x][i]<c[x][i])
{
q[++u].nod=i;
q[u].t=p;
viz[i]=1;
}
else
if(c[i][x]&&!viz[i]&&a[i][x]>0)
{
q[++u].nod=i;
q[u].t=p;
viz[i]=1;
}
}
if(!viz[n])break;
x=u;
// cout<<"drum \n";
// rec(u);
minim=32000;
while(q[x].t)
{
k=q[q[x].t].nod;
y=q[x].nod;
if(c[k][y])minim=min(minim,c[k][y]-a[k][y]);
else minim=min(minim,a[y][k]);
x=q[x].t;
}
// cout<<'\n'<<"minim :"<<minim<<'\n'<<'\n';
x=u;
while(q[x].t)
{
k=q[q[x].t].nod;
y=q[x].nod;
if(c[k][y])a[k][y]+=minim;
else a[y][k]-=minim;
x=q[x].t;
}
}
unsigned long sol=0;
ofstream out("maxflow.out");
for(i=1;i<=n;i++)sol+=a[i][n];
out<<sol<<'\n';
out.close();
return 0;
}