Cod sursa(job #1936636)

Utilizator tqmiSzasz Tamas tqmi Data 23 martie 2017 11:33:07
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.85 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
ifstream fin("fmcm.in");
ofstream fout("fmcm.out");
const int Nmax=505,INF=1<<30;
int N,M,S,D,drum;
vector <int> G[Nmax];
queue <int> Q;
int inQ[Nmax],dist[Nmax],mf[Nmax][Nmax],cost[Nmax][Nmax],TT[Nmax],cf[Nmax][Nmax];
void read()
{
    fin>>N>>M>>S>>D;
    for(int i=1;i<=M;i++)
    {
        int x,y,z,c;
        fin>>x>>y>>c>>z;
        G[x].push_back(y);
        G[y].push_back(x);
        cost[x][y]=z;
        cost[y][x]=-z;
        mf[x][y]=c;
    }
}

int bf()
{

    memset(inQ,0,sizeof(inQ));
    for(int i=1;i<=N;i++)
    {
        dist[i]=INF;
        TT[i]=-1;
    }
    Q.push(S);
    inQ[S]=1;
    dist[S]=0;
    while(!Q.empty())
    {
        int Nod=Q.front();
        Q.pop();
        for(int i=0;i<G[Nod].size();i++)
        {
            int vecin=G[Nod][i];
            if(mf[Nod][vecin]-cf[Nod][vecin]>0 &&  dist[Nod]+cost[Nod][vecin]<dist[vecin])
            {
                dist[vecin]=dist[Nod]+cost[Nod][vecin];
                TT[vecin]=Nod;
                if(!inQ[vecin])
                {
                    Q.push(vecin);
                    inQ[vecin]=1;
                }
            }
        }
        inQ[Nod]=0;
    }
    if(dist[D]!=INF)
    {
        int af=INF;
        drum=1;
        for(int i=D;i!=S;i=TT[i])
        {
            af=min(af,mf[TT[i]][i]-cf[TT[i]][i]);
        }
        for(int i=D;i!=S;i=TT[i])
        {
            cf[TT[i]][i]+=af;
            cf[i][TT[i]]-=af;
        }
        return af*dist[D];
    }
    return 0;
}



void solve()
{
    long long sol=0;
    drum=1;
    while(drum)
    {
        drum=0;
        sol+=bf();
    }
    fout<<sol;
}



int main()
{
    read();
    solve();
    return 0;
}