Cod sursa(job #1436788)

Utilizator avaspAva Spataru avasp Data 16 mai 2015 13:38:49
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.97 kb
#include<cstdio>
#include<vector>
using namespace std;
int ic,sf,coada[1001],pred[1001],a[1001][1001];
bool viz[1001],marc[1001];
int n,m;
vector<int>v[1001];
int valmin(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];
    }
    return val;
}
void update(int nod){
    int val,nnod;
    val=550000001;
    nnod=nod;
    while(pred[nod]!=0){
        if(a[pred[nod]][nod]<val)
            val=a[pred[nod]][nod];
        nod=pred[nod];
    }
    //nod=coada[sf];
    nod=nnod;
    while(pred[nod]!=0){
        a[pred[nod]][nod]-=val;
        a[nod][pred[nod]]+=val;
        nod=pred[nod];
    }
}


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


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;
        v[a1].push_back(b);
        v[b].push_back(a1);
        if(b==n)
            marc[a1]=true;
    }
    bool pp=true;
    while(bfs(1)==true){
        for(int i=1;i<=n;i++)
            viz[i]=false;
		for(int i=0;i<v[n].size();i++){
			int e=v[n][i];
            if(marc[e]==true){
                pred[n]=e;
                update(n);
            }
		}
    }

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