Cod sursa(job #1153197)

Utilizator ThomasFMI Suditu Thomas Thomas Data 25 martie 2014 12:16:18
Problema Flux maxim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include <fstream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;

#define NMax 1005
#define inf 2100000000

ifstream f("maxflow.in");
ofstream g("maxflow.out");

int n,m;
vector<int> v[NMax];
int C[NMax][NMax],F[NMax][NMax];
int viz[NMax],ant[NMax];

int Lant(int s)
{
    int a=inf,b=inf,val;
    int nod2,nod=s;
    while(ant[nod])
    {
        nod2=abs(ant[nod]);
        if(ant[nod]>0) a=min(a,C[nod2][nod]-F[nod2][nod]);
        else b=min(b,F[nod][nod2]);
        nod=nod2;
    }
    val=min(a,b);

    nod=s;
    while(ant[nod])
    {
        nod2=abs(ant[nod]);
        if(ant[nod]>0) F[nod2][nod]+=val;
        else F[nod][nod2]-=val;
        nod=nod2;
    }

    F[s][n]+=val;

    return val;
}

int BFS()
{
    int s,i,semn;
    queue<int> cd;
    cd.push(1);
    for(i=1;i<=n;i++) {viz[i]=ant[i]=0;}
    viz[1]=1;

    while(!cd.empty())
    {
        s=cd.front(); cd.pop();

        for(i=0;i<(int)v[s].size();i++) if(!viz[v[s][i]])
        {
            semn=0;
            if(F[s][v[s][i]]<C[s][v[s][i]]) semn=1;
            else if(!C[s][v[s][i]] && F[s][v[s][i]]) semn=-1;

            if(semn)
            {
                viz[v[s][i]]=1;
                ant[v[s][i]]=semn*s;
                cd.push(v[s][i]);
            }
        }
    }

    return viz[n];
}

int main()
{
    int i,a,b,c;
    int flow;

    f>>n>>m;
    for(i=1;i<=m;i++)
    {
        f>>a>>b>>c;
        C[a][b]=c;
        v[a].push_back(b);
        v[b].push_back(a);
    }

    for(flow=0;BFS();)
        for(i=0;i<(int)v[n].size();i++)
            flow+=Lant(v[n][i]);

    g<<flow<<"\n";

    f.close();
    g.close();
    return 0;
}