Cod sursa(job #2179612)

Utilizator circeanubogdanCirceanu Bogdan circeanubogdan Data 20 martie 2018 12:44:21
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <fstream>
#include <vector>
#include <queue>
#define DIM 1002

using namespace std;

ifstream in ("maxflow.in");
ofstream out("maxflow.out");

int n, m, x, y, Cap[DIM][DIM], Flow[DIM][DIM], t[DIM], flow;

bool viz[DIM];

vector<int> graf[DIM];

queue<int> q;

bool bfs(){
    q.push(1);
    for(int i = 1; i <= n; ++ i)
        viz[i] = 0;
    viz[1] = 1;
    while(!q.empty()){
        int nod = q.front();
        q.pop();
        for(int i = 0; i < graf[nod].size(); ++ i){
            int nodc = graf[nod][i];
            if(!viz[nodc] && Cap[nod][nodc] - Flow[nod][nodc] > 0){
                viz[nodc] = 1;
                q.push(nodc);
                t[nodc] = nod;
            }
        }
    }

    return viz[n];
}

int main()
{
    in>>n>>m;
    for(int i = 1; i <= m; ++ i){
        in>>x>>y;
        graf[x].push_back(y);
        graf[y].push_back(x);
        in>>Cap[x][y];
    }

    while(bfs()){
        for(int i = 0; i < graf[n].size(); ++ i){
            int nod = graf[n][i];
            if(Cap[nod][n] - Flow[nod][n] <= 0 || !viz[nod])
                continue;
            int minim = Cap[nod][n] - Flow[nod][n];
            while(nod != 1){
                minim = min(minim, Cap[t[nod]][nod] - Flow[t[nod]][nod]);
                nod = t[nod];
            }
            nod = graf[n][i];
            Flow[nod][n] += minim;
            Flow[n][nod] -= minim;
            flow += minim;
            while(nod != 1){
                Flow[t[nod]][nod] += minim;
                Flow[nod][t[nod]] -= minim;
                nod = t[nod];
            }
        }
    }

    out<<flow;

    return 0;
}