Cod sursa(job #2497263)

Utilizator vladcainamisirVlad Cainamisir vladcainamisir Data 22 noiembrie 2019 12:16:09
Problema Flux maxim Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.59 kb
#include<cstdio>
#include<cstring>
#include<queue>

const int NMAX = 1000;
int ad[NMAX + 1][NMAX + 1];
int flow[NMAX + 1][NMAX + 1];
int c[NMAX + 1][NMAX + 1];
int parent[NMAX + 1];
std :: queue<int>q;
int n , m ;
bool bfs()
{
q.push(1);
int ok = 0;
memset(parent,0,(n+1)*sizeof(int));
parent[1] = 1;
    while(q.empty() == false)
    {
        int nod = q.front();
        if(nod == n){
            ok = 1;
            break;
        }
        q.pop();
        for(int i = 1 ; i <= n ; i ++)
        {
            if(c[nod][i] - flow[nod][i] > 0)
            {
                if(parent[i] == 0){
                    parent[i] = nod;
                    q.push(i);
                }
            }
        }
    }
    while(q.empty() == false)
    q.pop();
    return ok;
}
int drum()
{
    int tata = parent[n] , nod = n, minim = 1 << 30;

    while(nod != 1)
    {
        minim = std :: min(minim , c[tata][nod] - flow[tata][nod]);
        nod = tata;
        tata = parent[nod];
    }
    return minim;
}
void actualizeaza(int n , int flux)
{
    int tata = parent[n] , nod = n;
    while(nod != 1)
    {
    flow[tata][nod] += flux;
    flow[nod][tata] -= flux;
    nod = tata;
    tata = parent[tata];
    }
}
int main()
{
int x , y;
    freopen("maxflow.in" , "r" , stdin);
    freopen("maxflow.out" ,"w" , stdout);
    scanf("%d%d" , &n , &m);
    for(int i = 1; i <= m ; i ++)
    {
        scanf("%d%d" , &x , &y);
        scanf("%d", &c[x][y]);
        ad[x][y] = 1;
    }
    int rez = 0;
    while(bfs())
    {
        int f = drum();
        actualizeaza(n , f);
        rez += f;
    }
    printf("%d" , rez);

}