Cod sursa(job #2076519)

Utilizator Horia14Horia Banciu Horia14 Data 26 noiembrie 2017 18:32:28
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.89 kb
#include<cstdio>
#include<vector>
#include<queue>
#define MAX_N 1000
#define oo 0x3f3f3f3f
using namespace std;

vector<int>G[MAX_N+1];
int c[MAX_N+1][MAX_N+1], f[MAX_N+1][MAX_N+1], T[MAX_N+1], n, m, S, D, maxflow;

bool BFS(int source) {
    vector<int>::iterator it;
    queue<int>Q;
    bool ok = false;
    int node, i;
    for(i = 1; i <= n; i++)
        T[i] = 0;
    T[source] = -1;
    Q.push(source);
    while(!Q.empty()) {
        node = Q.front();
        Q.pop();
        for(it = G[node].begin(); it != G[node].end(); it++)
            if(!T[*it] && c[node][*it] > f[node][*it]) {
                if(*it != D) {
                    T[*it] = node;
                    Q.push(*it);
                } else ok = true;
            }
    }
    return ok;
}

void dinic() {
    vector<int>::iterator it;
    bool drum = BFS(S);
    while(drum) {
        for(it = G[D].begin(); it != G[D].end(); it++)
            if(T[*it] && c[*it][D] > f[*it][D]) {
                T[D] = *it;
                int minim = oo;
                for(int node = D; node != S; node = T[node])
                    if(minim > c[T[node]][node] - f[T[node]][node])
                        minim = c[T[node]][node] - f[T[node]][node];
                if(minim <= 0) continue;
                maxflow += minim;

                for(int node = D; node != S; node = T[node]) {
                    f[T[node]][node] += minim;
                    f[node][T[node]] -= minim;
                }
            }
        drum = BFS(S);
    }
}

int main() {
    int x, y, z;
    FILE *fin, *fout;
    fin = fopen("maxflow.in","r");
    fout = fopen("maxflow.out","w");
    fscanf(fin,"%d%d",&n,&m);
    for(int i = 0; i < m; i++) {
        fscanf(fin,"%d%d%d",&x,&y,&z);
        G[x].push_back(y);
        G[y].push_back(x);
        c[x][y] = z;
    }
    S = 1;
    D = n;
    dinic();
    fprintf(fout,"%d\n",maxflow);
    fclose(fin);
    fclose(fout);
    return 0;
}