Cod sursa(job #1500647)

Utilizator sddddgjdZloteanu Anastasia sddddgjd Data 12 octombrie 2015 14:52:06
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.73 kb
#include<stdio.h>
#include<cstring>
#define N 1024
int vecini[N][N],cap[N][N],coada[N],flux[N][N],seen[N],prev[N];
int n;
int bfs(){
    int first=0,last=1;
    coada[0]=1;
    seen[1]=1;
    memset(prev, 0, sizeof prev);
    memset(seen, 0, sizeof seen);
    while(first<last&&seen[n]==0){
        int i;
        for(i=1;i<=vecini[coada[first]][0];i++){
            int nod=vecini[coada[first]][i];
            if(seen[nod]==0&&cap[coada[first]][nod]>flux[coada[first]][nod]){
                prev[nod]=coada[first];
                seen[nod]=1;
                coada[last++]=nod;
            }
        }
        first++;
    }
    return seen[n];
}
int main(){
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    int m;
    scanf("%d%d",&n,&m);
    int i;
    for(i=0;i<m;i++){
        int x,y,capacitate;
        scanf("%d%d%d",&x,&y,&capacitate);
        vecini[x][vecini[x][0]+1]=y;
        vecini[y][vecini[y][0]+1]=x;
        vecini[x][0]++,vecini[y][0]++;
        cap[x][y]+=capacitate;
    }
    while(bfs()){
        for(i=1;i<=vecini[n][0];i++){
            int nod=vecini[n][i];
            if(seen[nod]&&cap[nod][n]>flux[nod][n]){
                prev[n]=nod;
                int min=1000000000;
                int j=n;
                while(j!=1){
                    if(min>cap[prev[j]][j]-flux[prev[j]][j])
                        min=cap[prev[j]][j]-flux[prev[j]][j];
                    j=prev[j];
                }
                j=n;
                while(j!=1){
                    flux[prev[j]][j]+=min;
                    flux[j][prev[j]]-=min;
                    j=prev[j];
                }
            }
        }
    }
    int sum=0;
    for(i=1;i<n;i++)
        sum+=flux[i][n];
    printf("%d",sum);
    return 0;
}