Cod sursa(job #1509286)

Utilizator timicsIoana Tamas timics Data 23 octombrie 2015 17:51:11
Problema Algoritmul lui Gauss Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.81 kb
#include<stdio.h>
#include<vector>
#include<iostream>
#include<utility>
using namespace std;
int x,y,z,t,M;

#define inf 1000000000
int S,D,flux,N,rez,d[400],c[400][400],v[400][400],f[400][400],p[400];
int q[160000],first,last;
vector<int> m[400];
bool viz[400],inq[400];

inline void add(int x) {
    if(inq[x]) return;
    inq[x] = viz[x] = 1;
    q[last++] = x;
}

inline int pop() {
    int x = q[first++];
    inq[x] = 0;
    return x;
}

inline void reset_stuff() {
    first = last = 0;
    for(int i = 1; i <= N; ++i) {
        viz[i] = inq[i] = 0;
        d[i] = 1000000000;
    }
    d[S] = 0;
}

inline bool bfs() {
    reset_stuff();
    add(S);
    while(first < last) {
        int x = pop();
        if(x==D) continue;
        for(int i = 0; i < m[x].size(); ++i) {
            int y = m[x][i];
            if(f[x][y] < c[x][y] && d[y] > d[x] + v[x][y]) {
                add(y); p[y] = x;
                d[y] = d[x] + v[x][y];
            }
        }
    }
    return viz[D];
}

void update() {
    flux = inf;
    int curr = D;
    while(curr!=S) {
        if(c[p[curr]][curr] - f[p[curr]][curr] < flux) {
            flux = c[p[curr]][curr] - f[p[curr]][curr];
        }
        if(!flux) break;
        curr = p[curr];
    }
    curr = D;
    while(curr!=S) {
        f[p[curr]][curr] += flux;
        f[curr][p[curr]] -= flux;
        curr = p[curr];
    }
    rez += d[D]*flux;
}

void flow() {
    while(true) {
        if(!bfs()) break;
        update();
    }
}

int main() {
    freopen("fmcm.in","r",stdin);
    freopen("fmcm.out","w",stdout);
    scanf("%d%d%d%d",&N,&M,&S,&D);
    for(int i = 1; i <= M; ++i) {
        scanf("%d%d%d%d",&x,&y,&z,&t);
        m[x].push_back(y);
        m[y].push_back(x);
        c[x][y] = z;
        v[x][y] = t;
        v[y][x] = -t;
    }
    flow();

    printf("%d",rez);
    return 0;
}