Cod sursa(job #1565323)

Utilizator 2chainzTauheed Epps 2chainz Data 10 ianuarie 2016 17:12:07
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 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];
int pr[Nmax],f[Nmax],indi[Nmax];
queue<int> q;
int N,M;
int bfs(){
    for(int i=1;i<=N;i++) pr[i]=0;
    pr[1]=1,q.push(1),f[0]=0;
    while(!q.empty()){
        int p=q.front(); q.pop();
        for(int i=0;i<G[p].size();i++){
            if(G[p][i]==N){
                if(C[p][i]>0) f[++f[0]]=I[p][i]-1;
            }
            else if(C[p][i]>0 && !pr[G[p][i]]) pr[G[p][i]]=p,indi[G[p][i]]=i,q.push(G[p][i]);
        }
    }
    return f[0]!=0;
}
int addpath(int ind){
    int p=G[N][ind];
    int m=C[p][I[N][ind]-1];
    while(p!=1){
        m=min(m,C[pr[p]][indi[p]]);
        p=pr[p];
    }
    if(!m) return 0;
    p=G[N][ind];
    C[p][I[N][ind]-1]-=m;
    C[N][ind]+=m;
    while(p!=1){
        C[pr[p]][indi[p]]-=m;
        C[p][I[pr[p]][indi[p]]-1]+=m;
        p=pr[p];
    }
    return m;
}
int main(){
    in>>N>>M;
    for(int i=1;i<=M;i++){
        int x,y,e;
        in>>x>>y>>e;
        G[x].push_back(y);
        C[x].push_back(e);
        G[y].push_back(x);
        C[y].push_back(0);
        I[x].push_back(G[y].size());
        I[y].push_back(G[x].size());
    }
    int ans=0;
    while(bfs()) for(int i=1;i<=f[0];i++) ans+=addpath(f[i]);
    out<<ans<<'\n';
    return 0;
}