Cod sursa(job #1436422)

Utilizator avaspAva Spataru avasp Data 15 mai 2015 21:27:38
Problema Flux maxim Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include<cstdio>
using namespace std;
int ic,sf,coada[1001],pred[1001],a[1001][1001];
bool viz[1001],marc[1001];
int n,m;

int update(int nod){
    int val;
    //nod=coada[sf];
    val=550000001;
    while(pred[nod]!=0){
        if(a[pred[nod]][nod]<val)
            val=a[pred[nod]][nod];
        nod=pred[nod];
    }


    nod=coada[sf];
    while(pred[nod]!=0){
        a[pred[nod]][nod]-=val;
        a[nod][pred[nod]]+=val;
        nod=pred[nod];
    }
    return val;
}


bool bfs(int nod){
    ic=1;sf=1;
    coada[ic]=nod;
    viz[nod]=true;
    bool boolfin=false;
    while(ic<=sf){
        for(int i=1;i<n;i++)
            if(a[coada[ic]][i]!=0&&viz[i]==false){
                sf++;
                coada[sf]=i;
                viz[i]=true;
                pred[i]=coada[ic];
                if(marc[i]==true){
                    pred[n]=i;
                    int ret=update(n);
                    if(ret!=0)
                        boolfin=true;
                }
            }
    ic++;
    }
    return boolfin;
}


int main(){
    int a1,b,c;
    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%d",&a1,&b,&c);
        a[a1][b]=c;
        if(b==n)
            marc[a1]=true;
    }
    bool pp=true;
    while(bfs(1)==true){
        for(int i=1;i<=n;i++)
            viz[i]=false;
    }

    int tot=0;
    for(int i=1;i<=n;i++)
        tot+=a[i][1];
    printf("%d",tot);
    return 0;
}