Cod sursa(job #1168589)

Utilizator chiriacandrei25Chiriac Andrei chiriacandrei25 Data 9 aprilie 2014 02:22:44
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 kb
#include <cstdio>
#include <vector>
#include <queue>
#define Nmax 1005
#define INF 2000000000

using namespace std;

vector <int> L[Nmax];
queue <int> Q;
int F[Nmax][Nmax],C[Nmax][Nmax],tata[Nmax],N;
bool viz[Nmax];

inline bool Bfs()
{
    int i,j,nod,len,n;
    for(i=2;i<=N;++i)
        viz[i]=false;
    viz[1]=true;
    while(Q.size())
        Q.pop();
    Q.push(1);
    while(!Q.empty())
    {
        nod=Q.front(); Q.pop();
        if(nod==N)
            continue;
        len=L[nod].size();
        for(j=0;j<len;++j)
        {
            n=L[nod][j];
            if(!viz[n] && F[nod][n]<C[nod][n])
            {
                viz[n]=true;
                Q.push(n);
                tata[n]=nod;
            }
        }
    }
    return viz[N];
}

int main()
{
    int M,x,y,z,flow=0,minflow,len,n,i;
    freopen ("maxflow.in","r",stdin);
    freopen ("maxflow.out","w",stdout);
    scanf("%d%d", &N,&M);
    while(M--)
    {
        scanf("%d%d%d", &x,&y,&z);
        L[x].push_back(y);
        L[y].push_back(x);
        C[x][y]+=z;
    }
    while(Bfs())
    {
        len=L[N].size();
        for(i=0;i<len;++i)
            if(viz[L[N][i]] && F[L[N][i]][N]<C[L[N][i]][N])
            {
                n=L[N][i];
                tata[N]=n;
                minflow=INF;
                for(n=N;tata[n];n=tata[n])
                    minflow=min(minflow,C[tata[n]][n]-F[tata[n]][n]);
                if(!minflow)
                    continue;
                for(n=N;tata[n];n=tata[n])
                {
                    F[tata[n]][n]+=minflow;
                    F[n][tata[n]]-=minflow;
                }
                flow+=minflow;
            }
    }
    printf("%d\n", flow);
    return 0;
}