Pagini recente » Cod sursa (job #484476) | Cod sursa (job #1196806) | Cod sursa (job #2884953) | Cod sursa (job #990425)
Cod sursa(job #990425)
#include <fstream>
#include <cstring>
#include <algorithm>
#define N 1002
#define INF 1<<30
using namespace std;
FILE *fin=fopen("maxflow.in", "r"), *fout=fopen("maxflow.out", "w");
struct nod
{
int n;
nod *next;
} *a[N];
int C[N][N], F[N][N], Tr[N], v[N];
int cd[N];
int n, m;
void gadd(int x, int y)
{
nod *p=new nod;
p->n=y;
p->next=a[x];
a[x]=p;
}
int BFS()
{
int i, nods;
nod *p;
memset(v, 0, sizeof(v));
cd[0]=1;
cd[1]=1;
v[1]=1;
for(i=1;i<=cd[0];i++)
{
nods=cd[i];
if(nods==n) continue;
for(p=a[nods];p;p=p->next)
{
if(C[nods][p->n]==F[nods][p->n]||v[p->n]) continue;
v[p->n]=1;
Tr[p->n]=nods;
cd[++cd[0]]=p->n;
}
}
return v[n];
}
int main()
{
int flow, i, x, y, fmin;
nod *p;
fscanf(fin, "%d%d", &n, &m);
for(i=1;i<=m;i++)
{
fscanf(fin, "%d%d", &x, &y);
fscanf(fin, "%d", &C[x][y]);
gadd(x, y);
gadd(y, x);
}
for(flow=0;BFS();)
{
for(p=a[n];p;p=p->next)
{
if(C[p->n][n]==F[p->n][n]||!v[p->n]) continue;
Tr[n]=p->n;
fmin=INF;
for(i=n;i!=1;i=Tr[i])
{
fmin=min(fmin, C[Tr[i]][i]-F[Tr[i]][i]);
}
if(fmin==0) continue;
for(i=n;i!=1;i=Tr[i])
{
F[i][Tr[i]]-=fmin;
F[Tr[i]][i]+=fmin;
}
flow+=fmin;
}
}
fprintf(fout, "%d", flow);
}