Cod sursa(job #1686751)

Utilizator superstar1998Moldoveanu Vlad superstar1998 Data 12 aprilie 2016 13:39:39
Problema Flux maxim de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.39 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <bitset>
#include <algorithm>
#include <queue>
#include <cstring>
#define pb push_back
#define mp make_pair
#define MAXN 355
#define MAXX 0x3f
#define MAX 0x3f3f3f3f
#define INFILE "fmcm.in"
#define OUTFILE "fmcm.out"
using namespace std;
ifstream f(INFILE);
ofstream g(OUTFILE);
int d[MAXN],real_d[MAXN],old_d[MAXN],t[MAXN];
int n,m,s,D,F,FCst;
int C[MAXN][MAXN],cst[MAXN][MAXN];
vector<int> G[MAXN];
bitset<MAXN> inQ;
queue<int> q;
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > H;
void bellman()
{
    memset(old_d,MAXX,sizeof(old_d));
    old_d[s]=0;
    vector<int>::iterator it;
    int i;
    for(q.push(s),inQ[s]=1;!q.empty();q.pop())
    {
        i=q.front();
        inQ[i]=0;
        for(it=G[i].begin();it!=G[i].end();it++)
            if(C[i][*it]&&old_d[*it]>old_d[i]+C[i][*it])
            {
                old_d[*it]=old_d[i]+C[i][*it];
                if(!inQ[*it])
                    q.push(*it),inQ[*it]=1;
            }
    }
}
inline bool dijkstra()
{
    memset(d,MAXX,sizeof(d));
    d[s]=0;real_d[s]=0;
    H.push(mp(d[s],s));
    vector<int>::iterator it;
    for(;!H.empty();)
    {
        int ct=H.top().first,nod=H.top().second;
        H.pop();
        if(d[nod]!=ct)continue;
        for(it=G[nod].begin();it!=G[nod].end();it++)
            if(C[nod][*it])
            {
                int new_d=d[nod]+cst[nod][*it]+old_d[nod]-old_d[*it];
                if(new_d<d[*it])
                {
                    d[*it]=new_d;
                    real_d[*it]=real_d[nod]+cst[nod][*it];
                    t[*it]=nod;
                    H.push(mp(d[*it],*it));
                }
            }
    }
    memcpy(old_d,real_d,sizeof(d));
    if(d[D]==MAX) return false;
    int Min=MAX;
    for(int aux=D;aux!=s;aux=t[aux])
        Min=min(Min,C[t[aux]][aux]);
    F+=Min;
    FCst+=Min*real_d[D];
    for(int aux=D;aux!=s;aux=t[aux])
        C[t[aux]][aux]-=Min,
        C[aux][t[aux]]+=Min;
    return true;
}
int main()
{
    f>>n>>m>>s>>D;
    int x,y,ct,cap;
    while(m--)
    {
        f>>x>>y>>cap>>ct;
        G[x].pb(y);
        G[y].pb(x);
        cst[x][y]=ct;
        cst[y][x]=-ct;
        C[x][y]=cap;
    }
    bellman();
    for(;dijkstra(););
    g<<FCst;
    f.close();
    g.close();
    return 0;
}