Cod sursa(job #1377983)

Utilizator OnimushaLordTiberiu Copaciu OnimushaLord Data 6 martie 2015 09:49:49
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
# include <cstdio>
# include <vector>
# include <cstring>
# define INF 2000000000
# define N 1010
# define pb push_back
# define vecin (*it)

using namespace std;

vector <int> G[N];
vector <int> :: iterator it;

int c[N][N],f[N][N];
int T[N],q[N],S,D,n,m;

bool bf()
{
    int nr=0,i;
    memset(T,0,sizeof(T));

    q[++nr]=S;
    for(i=1; i<=nr; ++i)
    {
        int nod=q[i];
        for(vector <int> ::  iterator it=G[nod].begin(); it!=G[nod].end(); ++it)
            if(!T[vecin] && c[nod][vecin]>f[nod][vecin])
            {
                if(vecin!=D)
                {
                    T[vecin]=nod;
                    q[++nr]=vecin;
                }
                else return true;
            }
    }
    return false;
}

void max_flow()
{
    int Max=0;
    for(int flux=0; bf();)
        for(it=G[D].begin(); it!=G[D].end(); ++it)
            if(T[vecin] && c[vecin][D]>f[vecin][D])
            {
                T[D]=vecin;
                int r=INF;
                for(int nod=D; nod!=1; nod=T[nod])
                    r=min(r,c[T[nod]][nod]-f[T[nod]][nod]);

                if(r<=0) continue;
                Max+=r;

                for(int nod=D; nod!=1; nod=T[nod])
                {
                    f[T[nod]][nod]+=r;
                    f[nod][T[nod]]-=r;
                }
            }
    printf("%d\n", Max);
}

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

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

    max_flow();
}