Cod sursa(job #571697)

Utilizator PavelRazvanPavel Razvan PavelRazvan Data 4 aprilie 2011 18:25:02
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include<algorithm>
using namespace std;
#include<vector>
#include<queue>

#define DIM 1005
#define pb push_back

vector <int> lst[DIM];
int vol[DIM][DIM],f[DIM][DIM],n,m,t[DIM],sol;
bool v[DIM];

inline void read ()
{
    int i,nr1,nr2,nr3;

    scanf("%d%d",&n,&m);
    for(i=1;i<=m;++i)
    {
        scanf("%d%d%d",&nr1,&nr2,&nr3);
        vol[nr1][nr2]+=nr3;
        lst[nr1].pb (nr2);
        lst[nr2].pb (nr1);
    }
}
inline bool bf ()
{
    int i,nr;
    queue <int> q;

    for(i=1;i<=n;++i)
        v[i]=0;
    v[1]=1;
    q.push(1);

    while(!q.empty ())
    {
        nr=q.front ();
        for(i=0;i<lst[nr].size ();++i)
            if(vol[nr][lst[nr][i]]!=f[nr][lst[nr][i]] && v[lst[nr][i]]==0)
            {
                t[lst[nr][i]]=nr;
                v[lst[nr][i]]=1;
                if(lst[nr][i]!=n)
                    q.push(lst[nr][i]);
            }
        q.pop ();
    }
    return v[n];
}

inline void solve ()
{
    int i,j,minim;

    while(bf())
        for(i=0;i<lst[n].size ();++i)
            if(vol[lst[n][i]][n]!=f[lst[n][i]][n] && v[lst[n][i]]==1)
            {
                t[n]=lst[n][i];

                minim=1<<30;
                for(j=n;j!=1;j=t[j])
                    minim=min(minim,vol[t[j]][j]-f[t[j]][j]);

                sol+=minim;
                for(j=n;j!=1;j=t[j])
                {
                    f[t[j]][j]+=minim;
                    f[j][t[j]]-=minim;
                }
            }
}
int main ()
{
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    read ();
    solve ();
    printf("%d",sol);
    return 0;
}