Pagini recente » Monitorul de evaluare | Cod sursa (job #2142632) | Cod sursa (job #1243730) | Cod sursa (job #5348) | Cod sursa (job #721348)
Cod sursa(job #721348)
#include<cstdio>
#include<vector>
using namespace std;
#define NMAX 1005
#define INF 2000000000
FILE *f=fopen("maxflow.in","r");
FILE *g=fopen("maxflow.out","w");
long C[NMAX][NMAX],maxflow,F[NMAX][NMAX],viz[NMAX],T[NMAX],coada[NMAX];
int n,m;
vector<int> L[NMAX];
int BF()
{ long vf=0;
memset(viz,0,sizeof(viz) );
viz[1]=1;
vf++;
coada[vf]=1;
for (int i=1;i<=vf;i++)
{
if (coada[i]==n)
continue;
for (int j=0;j<L[ coada[i] ].size();j++)
if (!viz[ L[coada[i]][j] ] && C[coada[i]][ L[coada[i]][j] ] != F[coada[i]][ L[coada[i]][j] ])
{ vf++;
coada[vf]=L[coada[i]][j];
viz[L[coada[i]][j]]=1;
T[L[coada[i]][j]]=coada[i];
}
}
return viz[n];
}
int main()
{
fscanf(f,"%d%d",&n,&m);
for (int k=1;k<=m;k++)
{ int x,y;
long z;
fscanf(f,"%d%d%ld",&x,&y,&z);
L[x].push_back(y);
L[y].push_back(x);
C[x][y]=z;
}
while ( BF() )
for (int i=0;i<L[n].size();i++)
{
if (F[ L[n][i] ][n]==C[ L[n][i] ][n] || !viz[ L[n][i] ] )
continue;
T[n]=L[n][i];
int j=n;
long minim=INF;
while(j!=1)
{ if ( C[T[j] ][ j ] - F[T[j]][j] < minim)
minim= C[T[j] ][j] - F[T[j]][ j ];
j=T[j];
}
j=n;
while(j!=1)
{ F[ T[j] ][ j ]+=minim;
F[ j ] [T[j]] -=minim;
j=T[j];
}
maxflow+=minim;
}
fprintf(g,"%ld\n",maxflow);
return 0;}