Cod sursa(job #1239956)

Utilizator timicsIoana Tamas timics Data 10 octombrie 2014 00:41:06
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.31 kb
#include<stdio.h>
#include<vector>
#include<iostream>
#include<utility>
using namespace std;
int S,D,flux,x,y,z,t,M,N,rez,d[400],c[400][400],v[400][400],f[400][400],q[160000],first,last,p[400];
vector<int> m[400];
bool viz[400],qu[400];
  
inline int size() {
    return last - first;
}
 
inline void add(int x) {
    //cout<<first<<" "<<last<<endl;
    if(qu[x]) return;
    qu[x] = 1;
    q[last] = x;
    ++last;
}
 
inline void clear() {
    first = 0, last = 0;
}

inline int pop() {
    int x = q[first];
    ++first;
    qu[x] = 0;
    return x;
}
 
inline void reset_stuff() {
    clear();
    for(int i = 1; i <= N; ++i) {
        viz[i] = 0;
        qu[i] = 0;
        d[i] = 1000000000;
    }
    d[S] = 0;
}
 
inline bool bfs() {
    reset_stuff();
    add(S);
    viz[S] = 1;
    while(size()) {
      //  cout<<size()<<endl;
        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);
                viz[y] = 1;
                p[y] = x;
                d[y] = d[x] + v[x][y];
            }
        }
    }
    //cout<<"DONE"<<endl;
    return viz[D];
}
 
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;
    }
    while(true) {
       if(!bfs()) {
            break;
        }
        flux = 110000;
                int curr = D;
                while(p[curr]) {
                    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];
                }  // cout<<"WHERE"<<endl;
       
                curr = D;
                while(p[curr]) {
                    f[p[curr]][curr] += flux;
                    f[curr][p[curr]] -= flux;
                    curr = p[curr];
                }
                rez += d[D]*flux;
              //  cout<<d[D]<<endl;
    }
    printf("%d",rez);
    return 0;
}