Cod sursa(job #1872676)

Utilizator NastureNasture Anca Nasture Data 8 februarie 2017 14:41:42
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.25 kb
#include<cstdio>
#include<vector>
#include<queue>
#include<cstring>
#define nmax 1000
using namespace std;
int fluxmaxim,c[nmax+1][nmax+1],f[nmax+1][nmax+1],sursa,destinatie,n,T[nmax+1];
vector <int> lista[nmax+1];
void citire(){
    int n1,n2,m,cap;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++){
        scanf("%d%d%d",&n1,&n2,&cap);
        c[n1][n2]=cap;
        lista[n1].push_back(n2);
        lista[n2].push_back(n1);
    }
}
int bfs(){
    ///graful rezidual pastreaza acele arce pentru care se mai poate adauga flux, adica mai este spatiu flux de adaugat
    int ok=0,fiu;///pp ca nu exista drum pana la destinatie

    queue <int> coada;
    memset(T,0,sizeof(T));
    coada.push(sursa);
    T[sursa]=-1;
    while(!coada.empty()){
        int nod=coada.front();
        for(int i=0;i<lista[nod].size();i++){
            fiu=lista[nod][i];
            if(T[fiu]==0/*daca nu a fost vizitat*/ &&c[nod][fiu]>f[nod][fiu])
                if(fiu!=destinatie){
                    T[fiu]=nod;
                    coada.push(fiu);
                }
                else
                    ok=1;
        }
        coada.pop();
    }
    return ok;
}

int dinic(){
    int drum,nod,min;
    //drum primeste 1 daca exista
    for(drum=bfs();drum;drum=bfs())
        ///parcurge drumul de la destinatie la vecinii sai
        for(int i=0;i<lista[destinatie].size();i++){
            nod=lista[destinatie][i];
            if(T[nod]!=0&&c[nod][destinatie]>f[nod][destinatie]){
                T[destinatie]=nod;
                min=2000000000;
                for(int nod=destinatie;nod!=sursa;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;///sare peste ce a ramas din for
                fluxmaxim+=min;
                for(int nod=destinatie;nod!=sursa;nod=T[nod]){
                    f[T[nod]][nod]+=min;
                    f[nod][T[nod]]-=min;
                }
            }
        }
}

int main(){
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    citire();
    sursa=1;
    destinatie=n;
    dinic();
    printf("%d",fluxmaxim);
    return 0;
}