Cod sursa(job #1166537)

Utilizator ovidiustiruOvidiu Ioan Stiru ovidiustiru Data 3 aprilie 2014 17:34:47
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <fstream>
#include <queue>
#define oo 0x3f3f3f3f
using namespace std;

int f[1005][1005];
queue <int> q;
int t[1005],n,m;


bool bfs(int s, int d){
    bool used[1005];

    fill(used,used+n+5,0);
    fill(t,t+n+5,0);
    used[s]=1;
    q.push(s);
    while(!q.empty()){
        int u=q.front();
        q.pop();

        for(int i=s;i<=d;i++){
            if(used[i]!=1){
                if(f[u][i]>0){
                    q.push(i);
                    t[i]=u;
                    used[i]=1;
                }
            }
        }


    }

    if(t[d]) return 1;
    return 0;
}

int flow(int s,int d){
    int mi=oo;
    int fl=0;
    while (bfs(s,d)){

        for(int j=s;j<d;j++){
            if(f[j][d]>0){
                mi=oo;
                if(f[j][d]<mi)mi=f[j][d];
                for(int i=j;i>s;i=t[i]){
                    if(f[t[i]][i]<mi)mi=f[t[i]][i];
                }
                if(mi==oo)continue;

                f[j][d]-=mi;
                f[d][j]+=mi;
                for(int i=j;i>s;i=t[i]){
                    f[t[i]][i]-=mi;
                    f[i][t[i]]+=mi;
                }
                fl+=mi;

            }
        }
    }
    return fl;
}


int main()
{
    ifstream fin("maxflow.in");
    ofstream fout("maxflow.out");
    int a,b,c;
    fin>> n>>m;
    for(int i=0;i<m;i++){
        fin>>a>>b>>c;
        f[a][b]=c;
    }
    int re=flow(1,n);

    fout<<re;

    return 0;
}