Cod sursa(job #1879656)

Utilizator vancea.catalincatalin vancea.catalin Data 15 februarie 2017 08:36:50
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include<iostream>
#include<fstream>
#include<bitset>
#include<vector>
#include<queue>
#define inf 1999999999
#define DN 1010
using namespace std;
fstream fin("maxflow.in",ios::in),fout("maxflow.out",ios::out);
vector<int> v[DN];
queue<int> q;
int n,m,cst[DN][DN],t[DN],ap[DN],start,stop,total;
bool bfs()
{
    int x,i;
    for(i=0;i<=n;i++) ap[i]=0;
    q.push(1);
    ap[1]=1;
    while(q.empty()==0)
    {
        x=q.front(); q.pop();
        if(x==n) continue;
        for(const int& f:v[x])
        {
            if(cst[x][f]>0 && ap[f]==0)
            {
                ap[f]=1;t[f]=x;
                q.push(f);
            }
        }
    }
    return ap[n];
}
void flux()
{
    int aux,minim;
    while(bfs())
    {
        for(const int& f:v[n])
        {
            if(ap[f]==1 && cst[f][n]>0)
            {
                aux=n;
                t[n]=f;
                minim=inf;
                while(aux!=1)
                {
                    minim=min(minim,cst[t[aux]][aux]);
                    aux=t[aux];
                }
                aux=n;
                while(aux!=1)
                {
                    //cout<<aux<<",";
                    cst[t[aux]][aux]-=minim;
                    cst[aux][t[aux]]+=minim;
                    aux=t[aux];
                }
                total+=minim;
                //cout<<"->"<<minim<<"\n";
            }
        }
    }
}
int main()
{
    int i,a,b,c;
    fin>>n>>m;
    for(i=1;i<=m;i++)
    {
        fin>>a>>b>>c;
        v[a].push_back(b);
        v[b].push_back(a);
        cst[a][b]=c;
    }
    flux();
    fout<<total;
}