Cod sursa(job #2063654)

Utilizator DawlauAndrei Blahovici Dawlau Data 11 noiembrie 2017 12:32:11
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include<fstream>
#include<list>
#include<bitset>
#include<climits>
#include<deque>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
const int NMAX=1005,INF=INT_MAX;
list<int>g[NMAX];
bitset<NMAX>vis;
int capacity[NMAX][NMAX],flow[NMAX][NMAX],tree[NMAX],n,m,min_flow;
void read_data(){
    int from,to,c;
    fin>>n>>m;
    while(m--){
        fin>>from>>to>>c;
        g[from].push_back(to);
        g[to].push_back(from);
        capacity[from][to]=c;
    }
}
bool BFS(){
    deque<int>d;
    d.push_back(1);
    vis[1]=true;
    int node;
    list<int>::iterator it;
    while(!d.empty()){
        node=d.front();
        d.pop_front();
        if(node==n)
            d.clear();
        else{
            for(it=g[node].begin();it!=g[node].end();++it)
                if(!vis[*it] and capacity[node][*it]!=flow[node][*it]){
                    tree[*it]=node;
                    d.push_back(*it);
                    vis[*it]=true;
                }
        }
    }
    return vis[n];
}
void get_min_flow(){
    int node;
    min_flow=INF;
    for(node=n;node!=1;node=tree[node])
        min_flow=min(min_flow,capacity[tree[node]][node]-flow[tree[node]][node]);
}
void change_flow(){
    int node;
    for(node=n;node!=1;node=tree[node]){
        flow[tree[node]][node]+=min_flow;
        flow[node][tree[node]]-=min_flow;
    }
}
int max_flow(){
    int flow=0;
    while(BFS()){
        get_min_flow();
        flow+=min_flow;
        change_flow();
        vis.reset();
    }
    return flow;
}
int main(){
    read_data();
    fout<<max_flow();
}