Cod sursa(job #1002497)

Utilizator ZoranZomboratZoran Zomborat Goran ZoranZomborat Data 27 septembrie 2013 21:41:02
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include<fstream>
#include<vector>
#include<string.h>
#define N_max 1005
#define inf 0x3f3f3f3f
using namespace std;
int C[N_max][N_max];
int F[N_max][N_max];
vector <int> G[N_max];
int n,m;
int TT[N_max];
int coada[N_max];
int viz[N_max];
int BFS()
{
int i,j,V ,nod;
coada[0]=1;
coada[1]=1;
memset(viz,0,sizeof(viz));
viz[1]=1;
for(i=1;i<=coada[0];i++)
{
nod=coada[i];
if(nod==n)continue;
for(j=0;j<G[nod].size();j++)
{
    V=G[nod][j];
    if(F[nod][V]==C[nod][V]||viz[V])continue;
    viz[V]=1;
    TT[V]=nod;
    coada[++coada[0]]=V;
}
}
return viz[n];
}
int main()
{
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int x,y,z,i,nod,flow,fmin;
fin>>n>>m;
for(i=1;i<=m;i++)
{
    fin>>x>>y>>z;
    C[x][y]=z;
    G[x].push_back(y);
    G[y].push_back(x);
}
for(flow=0;BFS();)
    for(i=0;i<G[n].size();i++)
    {
        nod=G[n][i];
        if(F[nod][n]==C[nod][n]||!viz[nod])continue;
        TT[n]=nod;
        fmin=inf;
        for(nod=n;nod!=1;nod=TT[nod])
            fmin=min(fmin,C[TT[nod]][nod]-F[TT[nod]][nod]);
        if(fmin==0)continue;
        for(nod=n;nod!=1;nod=TT[nod])
        {
            F[TT[nod]][nod]+=fmin;
            F[nod][TT[nod]]-=fmin;
        }
        flow+=fmin;
    }
fout<<flow;
}