Cod sursa(job #868253)

Utilizator octavdOctavian Dumitrascu octavd Data 30 ianuarie 2013 20:59:39
Problema Flux maxim Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.82 kb
#include <fstream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>

using namespace std;

ifstream in1;
vector <int> g[1002];
int S,D,flux,M,N,x,y,T[1002],f[1002][1002],c[1002][1002];
int bfs()
{
    int ok=0;
    queue <int> q;
    //memset(T,0,sizeof(T));
    T[S]=-1;
    q.push(S);
    for(int nod;!q.empty();q.pop())
    {
        nod=q.front();
        for(vector <int>::iterator it=g[nod].begin();it!=g[nod].end();++it)
            if(T[*it]==0&&c[nod][*it]>f[nod][*it])
            {
                if(*it!=D)
                {
                    T[*it]=nod;
                    q.push(*it);
                }
                else ok=1;
            }
    }
    return ok;
}

void dinic()
{
    while (bfs())
    {
       for(vector <int>::iterator it=g[D].begin();it!=g[D].end();++it)
            if(T[*it]&&c[*it][D]>f[*it][D])
            {
                T[D]=*it;
                int min=1<<31-1;
                for(int nod=D;nod!=S;nod=T[nod])
                    if(min>c[T[nod]][nod]-f[T[nod]][nod])
                        min=c[T[nod]][nod]-f[T[nod]][nod];
                if(min<=0) continue;
                flux=flux+min;
                for(int nod=D;nod!=S;nod=T[nod])
                {
                f[T[nod]][nod]=f[T[nod]][nod]+min;
                    f[nod][T[nod]]=f[nod][T[nod]]-min;
                }
            }
    }
}


int main()
{
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    memset(c,0,sizeof(c));
    memset(f,0,sizeof(f));
    flux=0;
    scanf("%d%d",&N,&M);
    for(int i=1;i<=M;i++)
    {
        scanf("%d%d",&x,&y);
        scanf("%d",&c[x][y]);
        g[x].push_back(y);
        g[y].push_back(x);
    }
    S=1;
    D=N;
    dinic();
    printf("%d",flux);
    return 0;
}