Pagini recente » Cod sursa (job #1310168) | Cod sursa (job #361026) | Cod sursa (job #1289516) | Cod sursa (job #1179336) | Cod sursa (job #911589)
Cod sursa(job #911589)
#include<fstream>
#include<queue>
#define NMAX 1010
#define INF 110011
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
int n, m, C[NMAX][NMAX], F[NMAX][NMAX], vz[NMAX], q[NMAX], drum[NMAX];
void Citeste()
{
int i, x, y, cap;
f>>n>>m;
for (i=1; i<=m; ++i)
{
f>>x>>y>>cap;
C[x][y]=cap;
}
}
void Initializeaza()
{
int i;
for (i=1; i<=n; ++i) vz[i]=0;
}
void BFS()
{
int i, p=1, u=1, x ,y ;
q[1]=1; vz[1]=INF;
while (p<=u && !vz[n])
{
x=q[p++];
for (i=1; i<=n; ++i)
if (!vz[i])
{
y=i;
if (C[x][y]>F[x][y])
{
vz[y]=x;
q[++u]=y;
}
else
if (F[y][x]>0)
{
vz[y]=-x;
q[++u]=y;
}
}
}
}
void Ameliorare()
{
int nod=n, nr=0, mn=INF, x, y, i;
while (nod!=INF)
{
drum[++nr]=nod;
if (nod<0) nod*=(-1);
x=vz[nod];
if (x!=INF)
if (x<0)
mn=min(mn, F[nod][-x]);
else
mn=min(mn, C[x][nod]-F[x][nod]);
nod=x;
}
for (i=1; i<nr; ++i)
{
if (drum[i+1]<0)
{
F[drum[i]][-drum[i+1]]-=mn;
drum[i+1]*=-1;
}
else
F[drum[i+1]][drum[i]]+=mn;
}
}
void Solve()
{
do
{
Initializeaza();
BFS();
if (vz[n]) Ameliorare();
}while (vz[n]);
}
void Afis()
{
int i, REZ=0;
for (i=1; i<n; ++i) REZ+=F[i][n];
g<<REZ<<"\n";
}
int main()
{
Citeste();
Solve();
Afis();
f.close();
g.close();
return 0;
}