Cod sursa(job #1516626)

Utilizator AndyCatrunaCatruna Andy AndyCatruna Data 3 noiembrie 2015 11:42:41
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.72 kb
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
#define dim 1005
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int n,i,c[dim][dim],f[dim][dim],viz[dim],nod,sol,t[dim],m,x,y,z,minim;
queue <int>q;
vector <int> v[dim];
int bfs(){
    while(!q.empty()){
        q.pop();
    }
    memset(viz,0,sizeof(viz));
    q.push(1);
    viz[1]=1;
    while(!q.empty()){
        int nod=q.front();
        if(nod==n){
            return 1;
        }
        for(int i=0;i<v[nod].size();i++){
            int vec=v[nod][i];
            if(viz[vec]==0 && c[nod][vec]>f[nod][vec]){
                t[vec]=nod;
                q.push(vec);
                viz[vec]=1;
            }
        }
        q.pop();
    }



    return 0;
}
int main(){
    fin>>n>>m;
    for(i=1;i<=m;i++){
        fin>>x>>y>>z;
        v[x].push_back(y);
        v[y].push_back(x);
        c[x][y]=z;
    }
    while(bfs()){
        for(i=0;i<v[n].size();i++){
            nod= v[n][i];
            if(viz[nod]){
                minim=c[nod][n]-f[nod][n];
                while(minim!=0 && t[nod]!=0){
                    minim=min(minim,c[t[nod]][nod]-f[t[nod]][nod]);
                    nod=t[nod];
                }
                if(minim){
                    nod=v[n][i];
                    f[nod][n]+=minim;
                    f[n][nod]-=minim;
                    sol+=minim;
                    while(t[nod]!=0){
                        f[t[nod]][nod]+=minim;
                        f[nod][t[nod]]-=minim;
                        nod=t[nod];
                    }
                }
            }
        }

    }
    fout<<sol<<"\n";


    return 0;
}