Cod sursa(job #1375256)

Utilizator dica69Alexandru Lincan dica69 Data 5 martie 2015 12:49:05
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <cstdio>
#include <vector>
#include <queue>
#include <climits>
#include <cstring>
#define Nmax 1001

using namespace std;
FILE *f1,*f2;
int n,m,i,u,v,c,C[Nmax][Nmax],T[Nmax],F[Nmax][Nmax],fl,nod,fmin;
bool use[Nmax];
vector <int> a[Nmax];
queue <int> q;

int bfs()
{int i,x;
memset(use,false,sizeof(use));
q.push(1);
use[1]=true;
while (!q.empty())
{x=q.front();q.pop();
if (x!=n)
for (i=0;i<(int)a[x].size();i++)
if (!use[a[x][i]] && C[x][a[x][i]]>F[x][a[x][i]])
{use[a[x][i]]=true;
q.push(a[x][i]);
T[a[x][i]]=x;
}
}
return use[n];
}

int main()
{f1 = fopen("maxflow.in","r");
f2 = fopen("maxflow.out","w");
fscanf(f1,"%d %d",&n,&m);
for (i=1;i<=m;i++) {fscanf(f1,"%d %d %d",&u,&v,&c);a[u].push_back(v);a[v].push_back(u);C[u][v]=c;}
fl=0;
while (bfs())
for (i=0;i<(int)a[n].size();i++)
{nod=a[n][i];
if (use[nod] && C[nod][n]>F[nod][n])

{T[n]=nod;
fmin=LONG_MAX;
for (nod=n;nod!=1;nod=T[nod])
if (C[T[nod]][nod]-F[T[nod]][nod]<fmin) fmin=C[T[nod]][nod]-F[T[nod]][nod];
if (fmin!=0)
{for (nod=n;nod!=1;nod=T[nod])
{F[T[nod]][nod]+=fmin;
F[nod][T[nod]]-=fmin;
}
fl+=fmin;
}
}
}
fprintf(f2,"%d\n",fl);


    return 0;
}

//Challenges are what make life interesting and overcoming them is what makes life meaningful.