Cod sursa(job #1259836)

Utilizator OnimushaLordTiberiu Copaciu OnimushaLord Data 10 noiembrie 2014 17:18:37
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.78 kb
# include <cstdio>
# include <vector>
# include <cstring>
# include <algorithm>

# define N (1<<10)
# define frunza (*it)
# define pb push_back
# define INF 1000000000

using namespace std;

int n,m,nod;
int T[N],Q[N];
int C[N][N],F[N][N];
vector <int> G[N];
vector <int> :: iterator it;

bool bf()
{
    int i,nod;
    vector <int> :: iterator it;
    memset(T, 0, sizeof(T));

    Q[0]=Q[1]=1;
    T[1]=-1;

    for(i=1; i<=Q[0]; ++i)
    {
        nod=Q[i];
        for(it=G[nod].begin(); it!=G[nod].end(); ++it)
            if(!T[frunza] && (C[nod][frunza]>F[nod][frunza]))
            {
                T[frunza]=nod;
                Q[++Q[0]]=frunza;
                if(frunza==n) return true;
            }
    }

    return false;
}

void load()
{
    int i,x,y,z;
    scanf("%d %d\n", &n, &m);
    for(i=1; i<=m; ++i)
    {
        scanf("%d %d %d\n", &x, &y, &z);
        C[x][y]=z;
        G[x].pb(y);
        G[y].pb(x);
    }
    return;
}

void solve()
{
    int flux,r;

    for(flux=0; bf();)
        for(it=G[n].begin(); it!=G[n].end(); ++it)
            if(T[frunza] && C[frunza][n]>F[frunza][n])
            {
                T[n]=frunza;
                r=INF;

                for(nod=n; nod!=1; nod=T[nod])
                    r=min(r, C[T[nod]][nod]-F[T[nod]][nod]);
                if(r<=0) continue;
                flux+=r;

                for(nod=n; nod!=1; nod=T[nod])
                {
                    F[T[nod]][nod]+=r;
                    F[nod][T[nod]]-=r;
                }
            }
    printf("%d\n", flux);
}

int main()
{
    freopen("maxflow.in", "r", stdin);
    freopen("maxflow.out", "w", stdout);

    load();
    solve();

    fclose(stdin);
    fclose(stdout);
    return 0;
}