Cod sursa(job #915561)

Utilizator tudy23Coder Coder tudy23 Data 15 martie 2013 10:01:25
Problema Flux maxim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2.3 kb
#include <cstdio>
#include <vector>
using namespace std;
vector< vector <int> > much;
vector< vector <int> > capacit;
vector< vector <int> > cpycap;
int dim[1001];
int n,m;
int flux,vmax=1<<30;
void citire()
{
    freopen("maxflow.in","r",stdin);
    scanf("%d%d",&n,&m);
    int v1,v2,fl;
    much.resize(n+1);
    capacit.resize(n+1);
    cpycap.resize(n+1);
    for(int i=1;i<=m;++i)
    {
        scanf("%d%d%d",&v1,&v2,&fl);
        much[v1].push_back(v2);
        much[v2].push_back(v1);
        capacit[v1].push_back(fl);
        capacit[v2].push_back(0);
        cpycap[v1].push_back(fl);
        cpycap[v2].push_back(0);
        dim[v1]++;
        dim[v2]++;
    }
}
void maxfl()
{
    while(1)
    {
        int c[1001],ant[1001]={0};
        int inc,sf;
        int vmin,nc;
        inc=sf=1;
        c[1]=1;
        ant[1]=-1;
        while(inc<=sf)
        {
            for(int i=0;i<dim[c[inc]];++i)
                if(ant[much[c[inc]][i]]==0&&capacit[c[inc]][i]>0)
                {
                    ant[much[c[inc]][i]]=c[inc];
                    c[++sf]=much[c[inc]][i];
                }
            ++inc;
        }
        if(ant[n]==0)
            break;
        vmin=vmax;
        nc=n;
        while(nc!=1)
        {
            int vc;
            for(int i=0;i<dim[ant[nc]];++i)
                if(much[ant[nc]][i]==nc)
                {
                    vc=capacit[ant[nc]][i];
                    break;
                }
            if(vc<vmin)
                vmin=vc;
            nc=ant[nc];
        }
        flux+=vmin;
        nc=n;
        while(nc!=1)
        {
            int vc;
            for(int i=0;i<dim[ant[nc]];++i)
                if(much[ant[nc]][i]==nc)
                {
                    vc=i;
                    break;
                }
            capacit[ant[nc]][vc]-=vmin;
            for(int i=0;i<dim[nc];++i)
                if(much[nc][i]==ant[nc])
                {
                    vc=i;
                    break;
                }
            capacit[nc][vc]+=vmin;
            nc=ant[nc];
        }
    }
}
void afis()
{
    freopen("maxflow.out","w",stdout);
    printf("%d\n",flux);
    fclose(stdout);
}
int main()
{
    citire();
    maxfl();
    afis();
    return 0;
}