Cod sursa(job #1119473)

Utilizator alexalghisiAlghisi Alessandro Paolo alexalghisi Data 24 februarie 2014 18:01:41
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.07 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <bitset>
#include <cstdio>
#include <vector>
#include <cmath>
#include <queue>
#include <string>
#include <map>
#include <set>
#include <cstring>


#define DN 369
#define pb push_back
#define mp make_pair
#define per pair<int,int>
#define INF (1<<30)
#define LL long long
#define un unsigned
#define x first
#define y second
using namespace std;

int n,m,s,d,dist[DN],C[DN][DN],cost[DN][DN],exista_drum,prec[DN],F[DN][DN];

vector < int > list[DN];
queue < int > q;
bitset< DN > in_q;

int bf(){

    for(int i=1;i<=n;++i){

        dist[i]=INF;
        prec[i]=-1;
    }
    dist[ s ] = 0;
    q.push(s);
    in_q[s] = 1;

    for( ; q.size() ; ){

        int nod = q.front();
        q.pop();
        in_q[nod] = 0;

        for(int i=0;i<list[ nod ].size(); ++i ){

            int next_nod = list[nod][i];

            if( C[nod][next_nod] - F[nod][next_nod] > 0 && dist[ next_nod ] > dist[nod] + cost[nod][next_nod] ){

                dist[ next_nod ] = dist[nod] + cost[nod][next_nod];
                prec[ next_nod ] = nod;
                if(!in_q[next_nod]){

                    in_q[next_nod] = 1;
                    q.push(next_nod);
                }

            }
        }
    }

    if( dist[ d ] != INF){

        int vmin = INF;
        exista_drum = 1;

        for(int nod = d; nod!=s ; nod = prec[nod] )
            vmin = min(vmin,C[prec[nod]][nod] - F[prec[nod]][nod]);
        for(int nod = d; nod!=s ; nod = prec[nod] ){

            F[prec[nod]][nod]+=vmin;
            F[nod][prec[nod]]-=vmin;
        }
        return vmin * dist[d];
    }
    return 0;
}

LL flux(){

    LL rez = 0;
    exista_drum = 1;
    for( ; exista_drum ;){

        exista_drum = 0;
        rez+=bf();
    }
    return rez;
}

int main()
{
    ifstream f("fmcm.in");
    ofstream g("fmcm.out");
    f>>n>>m>>s>>d;
    for(int i=1;i<=m;++i){

        int a,b,c,z;
        f>>a>>b>>c>>z;

        list[a].pb(b);
        list[b].pb(a);
        C[a][b]=c;
        cost[a][b]=z;
        cost[b][a]=-z; /// ?
    }
    g<< flux();

    return 0;
}