Cod sursa(job #2654507)

Utilizator refugiatBoni Daniel Stefan refugiat Data 1 octombrie 2020 12:03:47
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.61 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <bitset>
using namespace std;
ifstream si("maxflow.in");
ofstream so("maxflow.out");
const int inf=1000000000;
vector<int> v[1010];
queue<int> q;
bitset<1005> vaz;
int cap[1005][1005], flow[1005][1005], tata[1005], dest;
int bfs() {
    for(int i=2; i<=dest; i++)
        vaz[i]=0;
    q.push(1);
    vaz[1]=1;
    int nod;

    while(!q.empty()) {
        nod=q.front();
        q.pop();
        vector<int>::iterator it;
        for(it=v[nod].begin(); it!=v[nod].end(); it++) {
            if(!vaz[*it]&&cap[nod][*it]>flow[nod][*it]) {
                vaz[*it]=1;
                tata[*it]=nod;
                if(*it!=dest)
                    q.push(*it);
            }
        }
    }
    return vaz[dest];
}
int main() {
    int n, m;
    si>>n>>m;
    dest=n;
    int a, b;
    for(int i=0; i<m; ++i) {
        si>>a>>b;
        si>>cap[a][b];
        v[a].push_back(b);
        v[b].push_back(a);
    }
    int s, sol=0;
    while(bfs()) {
        vector<int>::iterator it;
        for(it=v[dest].begin(); it!=v[dest].end(); it++)
            if(vaz[*it]&&cap[*it][dest]>flow[*it][dest]) {
                tata[dest]=*it;
                s=inf;
                for(int i=dest; i!=1; i=tata[i])
                    s=min(s, cap[tata[i]][i]-flow[tata[i]][i]);
                for(int i=dest; i!=1; i=tata[i]) {
                    flow[tata[i]][i]+=s;
                    flow[i][tata[i]]-=s;
                }
                sol+=s;
            }
    }
    so<<sol<<'\n';
    return 0;
}