Cod sursa(job #1384225)

Utilizator teoionescuIonescu Teodor teoionescu Data 10 martie 2015 22:52:02
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
const int Nmax = 1001;
vector<int> G[Nmax],C[Nmax],I[Nmax];
vector<int> Lf,Lfi;
int pr[Nmax],id[Nmax];
int N,M;
queue<int> q;
int bfs(){
    for(int i=1;i<=N;i++) pr[i]=0;
    q.push(1); pr[1]=1;
    while(!q.empty()){
        int x=q.front(); q.pop();
        for(int i=0;i<G[x].size();i++){
            if(!pr[G[x][i]] && C[x][i]>0){
                pr[G[x][i]]=x;
                id[G[x][i]]=i;
                q.push(G[x][i]);
            }
        }
    }
    return pr[N]!=0;
}
int addpath(int x,int e){
    int p=x,m=C[x][e];
    if(!m) return 0;
    while(pr[p]!=p){
        m=min(m,C[pr[p]][id[p]]);
        p=pr[p];
    }
    if(!m) return 0;
    C[x][e]-=m;
    C[G[x][e]][I[x][e]]+=m;
    p=x;
    while(pr[p]!=p){
        C[pr[p]][id[p]]-=m;
        C[p][I[pr[p]][id[p]]]+=m;
        p=pr[p];
    }
    return m;
}
int main(){
    in>>N>>M;
    int x,y,c;
    for(int i=1;i<=M;i++){
        in>>x>>y>>c;
        G[x].push_back(y);
        G[y].push_back(x);
        C[x].push_back(c);
        C[y].push_back(0);
        I[x].push_back(G[y].size()-1);
        I[y].push_back(G[x].size()-1);
        if(y==N){
            Lf.push_back(x);
            Lfi.push_back(G[x].size()-1);
        }
    }
    int mf=0;
    while(bfs())
        for(int i=0;i<Lf.size();i++){
            mf += addpath(Lf[i],Lfi[i]);
        }
    out<<mf<<'\n';
    return 0;
}