Cod sursa(job #1516164)

Utilizator Athena99Anghel Anca Athena99 Data 2 noiembrie 2015 19:45:25
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <fstream>
#include <queue>
#include <vector>

using namespace std;

ifstream fin("fmcm.in");
ofstream fout("fmcm.out");

const int inf= 1<<30;
const int nmax= 350;

bool u[nmax+1];
int n, m, s, d;
int dist[nmax+1], p[nmax+1];
int c[nmax+1][nmax+1], cost[nmax+1][nmax+1], f[nmax+1][nmax+1];

queue <int> q;
vector <int> v[nmax+1];

bool bellmanford(  ) {
    for ( int i= 1; i<=n; ++i ) {
        dist[i]= inf;
        p[i]= u[i]= 0;
    }

    dist[s]= 0;
    u[s]= 1;
    for ( q.push(s); !q.empty(); q.pop() ) {
        int x= q.front();
        for ( vector <int>::iterator it= v[x].begin(); it!=v[x].end(); ++it ) {
            if ( c[x][*it]>f[x][*it] && dist[x]+cost[x][*it]<dist[*it] ) {
                dist[*it]= dist[x]+cost[x][*it];
                p[*it]= x;
                if ( u[*it]==0 ) {
                    u[*it]= 1;
                    q.push(*it);
                }
            }
        }
        u[x]= 0;
    }

    return dist[d]!=inf;
}

int fmcm(  ) {
    int ans= 0;
    while ( bellmanford() ) {
        int fmin= inf;
        for ( int i= d; i!=s; i= p[i] ) {
            fmin= min(fmin, c[p[i]][i]-f[p[i]][i]);
        }
        for ( int i= d; i!=s; i= p[i] ) {
            f[p[i]][i]+= fmin;
            f[i][p[i]]-= fmin;
        }

        ans= ans+fmin*dist[d];
    }

    return ans;
}

int main(  ) {
    fin>>n>>m>>s>>d;
    for ( int cnt= 1, x, y, t, z; cnt<=m; ++cnt ) {
        fin>>x>>y>>t>>z;
        v[x].push_back(y);
        v[y].push_back(x);

        c[x][y]= t;
        cost[x][y]= z;
        cost[y][x]= -z;
    }

    int sol= fmcm();
    fout<<sol<<"\n";

    return 0;
}