Cod sursa(job #866535)

Utilizator gramatovici_paulGramatovici Paul gramatovici_paul Data 28 ianuarie 2013 12:12:44
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

int c[1111],n,m,pred[1111],x[1111][1111];
bool fol[1111];
vector<int> a[1111];

inline int minim(int a,int b)
{
    return a<b ? a:b;
}

bool bfs()
{
    int st,dr,i;
    st=dr=1;
    c[1]=1;
    for(i=2;i<=n;++i)
        fol[i]=false;
    fol[1]=true;
    while(st<=dr && c[st]!=n)
    {
        for(i=0;i<a[c[st]].size();++i)
        {
            if(fol[a[c[st]][i]]==false && x[c[st]][a[c[st]][i]]>0)
            {
                c[++dr]=a[c[st]][i];
                pred[c[dr]]=c[st];
                fol[a[c[st]][i]]=true;
            }
        }
        ++st;
    }
    if(c[st]==n)
    {
        return true;
    }
    return false;
}

int flux_maxim(int poz)
{
    if(pred[poz]==0)
        return 2000000000;
    return minim(flux_maxim(pred[poz]),x[pred[poz]][poz]);
}

void actualizeaza(int p)
{
    int poz;
    poz=n;
    while(pred[poz]!=0)
    {
        x[pred[poz]][poz]-=p;
        x[poz][pred[poz]]+=p;
        poz=pred[poz];
    }
}

int main()
{
    int i,p,q,r,s;
    ifstream in("maxflow.in");
    ofstream out("maxflow.out");
    in>>n>>m;
    for(i=1;i<=m;++i)
    {
        in>>p>>q>>r;
        a[p].push_back(q);
        a[q].push_back(p);
        x[p][q]=r;
    }
    s=0;
    while(bfs())
    {
        p=flux_maxim(n);
        actualizeaza(p);
        s+=p;
    }
    out<<s;
    return 0;
}