Cod sursa(job #1612466)

Utilizator AndyCatrunaCatruna Andy AndyCatruna Data 24 februarie 2016 21:12:53
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
#define dim 355
#define inf 0x3f3f3f3f
using namespace std;
ifstream fin("fmcm.in");
ofstream fout("fmcm.out");
int n,i,j,m,source,destination,d[dim],viz[dim],t[dim],cap,sol,minim,u,z,c[dim][dim],f[dim][dim],cost[dim][dim],x,y;
vector<int> v[dim];
queue<int> q;
int BF(){
    memset(d,inf,sizeof(d));
    viz[source]=1;
    d[source]=0;
    q.push(source);
    while(!q.empty()){
        int nod = q.front();
        for(int i=0;i<v[nod].size();i++){
            int vecin=v[nod][i];
            if(c[nod][vecin]>f[nod][vecin] && d[vecin]> d[nod]+cost[nod][vecin]){
                d[vecin] = d[nod]+cost[nod][vecin];
                t[vecin]=nod;
                if(viz[vecin]==0){
                    q.push(vecin);
                    viz[vecin]=1;
                }
            }
        }
        q.pop();
        viz[nod]=0;

    }
    if(d[destination] == inf){
        return 0;
    }
    return 1;
}
int main(){
    fin>>n>>m>>source>>destination;
    for(i=1;i<=m;i++){
        fin>>x>>y>>cap>>z;
        v[x].push_back(y);
        v[y].push_back(x);

        c[x][y]=cap;
        cost[x][y]=z;
        cost[y][x]=-z;
    }
    while(BF()){
        u=destination;
        minim=inf;

        while(t[u]){
            if(minim>c[t[u]][u]-f[t[u]][u]){
                minim=c[t[u]][u]-f[t[u]][u];

            }
            u=t[u];
        }
        u=destination;
        while(t[u]){
            sol+=minim*cost[t[u]][u];
            f[t[u]][u]+=minim;
            f[u][t[u]]-=minim;
            u=t[u];
        }
    }
    fout<<sol<<"\n";

    return 0;}