Cod sursa(job #2308027)

Utilizator DimaTCDima Trubca DimaTC Data 26 decembrie 2018 09:25:26
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include<bits/stdc++.h>
#define N 1005
using namespace std;

const int inf = 2e9;

#define DIM 10000
char buff[DIM];
int poz=0;

void read(int &numar)
{
     numar = 0;
     while (buff[poz] < '0' || buff[poz] > '9')
          if (++poz == DIM)
               fread(buff,1,DIM,stdin),poz=0;
     while ('0'<=buff[poz] && buff[poz]<='9')
     {
          numar = numar*10 + buff[poz] - '0';
          if (++poz == DIM)
               fread(buff,1,DIM,stdin),poz=0;
     }
}
vector<int> V[N];
int a[N][N];
queue<int> Q;
int viz[N];
int rs, n, m;

bool BFS() {
    for (int i=1; i<=n; i++) viz[i] = -1;
    viz[1] = 0;
    while (Q.size()) Q.pop();
    Q.push(1);
    while (Q.size()) {
        int x = Q.front(); Q.pop();
        for (auto y : V[x]) {
            if (viz[y]==-1 && a[x][y]>0) {
                viz[y]=x;
                Q.push(y);
                if (y == n) return 1;
            }
        }
    }
    return 0;
}

int main() {
    freopen("maxflow.in", "r", stdin);
    freopen("maxflow.out", "w", stdout);
    cin>>n>>m;

    for (int i=1; i<=m; i++) {
        int x,y,c; read(x); read(y); read(c);
        V[x].push_back(y);
        V[y].push_back(x);
        a[x][y] += c;
    }

    while (BFS()) {
        int pathFlow = inf;
        for (int i=n; i!=1; i=viz[i]) {
            pathFlow = min(pathFlow, a[viz[i]][i]);
        }

        for (int i=n; i!=1; i=viz[i]) {
            a[viz[i]][i] -= pathFlow;
            a[i][viz[i]] += pathFlow;
        }

        rs+=pathFlow;
    }
    cout<<rs;

    return 0;
}