Cod sursa(job #993851)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 4 septembrie 2013 16:05:45
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.89 kb
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
#include <bitset>
#include <climits>
#include <memory.h>

FILE *f=fopen("maxflow.in","r");
FILE *g=fopen("maxflow.out","w");

#define pb push_back
using namespace std;
const int Nmax = 1005;
const int Mmax = 5005;

queue<int> Q;
int used[Nmax][Nmax];
vector< int > lv[Nmax];
int capacitate[Nmax][Nmax],flux[Nmax][Nmax],tata[Nmax];
int N,M;

inline void get_graph(){
    fscanf(f,"%d%d",&N,&M);
    int a,b,c;
    for(int i=1;i<=M;++i){
        fscanf(f,"%d%d%d",&a,&b,&c);
        lv[a].pb(b);
        lv[b].pb(a);
        capacitate[a][b]=c;
    }
}
int times=0;
inline bool BFS()
{
    ++times;
    vector<int> ::iterator it;
    used[1][1]=1;
    Q.push(1);
    int k;
    while(!Q.empty())
    {
        k=Q.front();Q.pop();
        if(k != N)
        for(it=lv[k].begin();it!=lv[k].end();++it)
            if(!used[times][*it] && capacitate[k][*it]-flux[k][*it]!=0)
            {
                tata[*it]=k;
                used[times][*it] = true;
                Q.push(*it);
            }
    }
    return used[times][N];
}

inline void FLOW()
{
    int flow=0,nod,fmin;
    while(BFS())
        for(vector<int> ::iterator it= lv[N].begin();it!=lv[N].end();++it)
        {
            if(flux[*it][N]==capacitate[*it][N] || ! used[times][*it]) continue;
            fmin = INT_MAX/2;
            tata[N] = *it;
            for(nod = N;nod != 1; nod=tata[nod])
                    fmin=min(fmin,capacitate[tata[nod]][nod]-flux[tata[nod]][nod]);
            if(fmin==0)continue;
            for(nod = N;nod != 1; nod=tata[nod])
            {
                flux[tata[nod]][nod] += fmin;
                flux[nod][tata[nod]] -= fmin;
            }
            flow += fmin;
        }
    fprintf(g,"%d",flow);
}
int main()
{
    get_graph();
    FLOW();
    return 0;
}