Cod sursa(job #2289590)

Utilizator gavra_bogdanBogdan Gavra gavra_bogdan Data 24 noiembrie 2018 21:30:28
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.59 kb
#include <cstdio>
#include <queue>
#include <vector>
#define Nmax 1005

using namespace std;

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

inline bool Bfs()
{
    int i,nod;
    vector<int>::iterator it;
    for(i=2;i<=N;++i)
        viz[i]=false;
    viz[1]=true; Q.push(1);
    while(!Q.empty())
    {
        nod=Q.front(); Q.pop();
        if(nod==N) continue;
        for(it=L[nod].begin();it!=L[nod].end();++it)
            if(!viz[*it] && F[nod][*it]<C[nod][*it])
            {
                viz[*it]=true; tata[*it]=nod;
                Q.push(*it);
            }
    }
    return viz[N];
}

int main()
{
    int M,x,y,z,flow=0,minflow,j;
    vector<int>::iterator it;
    freopen ("maxflow.in","r",stdin);
    freopen ("maxflow.out","w",stdout);
    scanf("%d%d", &N,&M);
    while(M--)
    {
        scanf("%d%d%d", &x,&y,&z);
        C[x][y]=z;
        L[x].push_back(y);
        L[y].push_back(x);
    }
    while(Bfs())
    {
        for(it=L[N].begin();it!=L[N].end();++it)
            if(viz[*it])
            {
                minflow=C[*it][N]-F[*it][N];
                for(j=*it;tata[j];j=tata[j])
                    minflow=min(minflow,C[tata[j]][j]-F[tata[j]][j]);
                F[*it][N]+=minflow; F[N][*it]-=minflow;
                for(j=*it;tata[j];j=tata[j])
                {
                    F[tata[j]][j]+=minflow;
                    F[j][tata[j]]-=minflow;
                }
                flow+=minflow;
            }
    }
    printf("%d\n", flow);
    return 0;
}