Cod sursa(job #1900539)

Utilizator vancea.catalincatalin vancea.catalin Data 3 martie 2017 14:28:04
Problema Flux maxim de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 kb
#include<iostream>
#include<fstream>
#include<vector>
#include<queue>
#define DN 360
#define DM 12600
#define inf 99999
using namespace std;
fstream fin("fmcm.in",ios::in),fout("fmcm.out",ios::out);
priority_queue<pair<int,int> > q;
int cp[DN][DN],cs[DN][DN],t[DN],d[DN];
vector<int> v[DN];

int N,M,S,D;

int dijkstra()
{
    int nod,cst,f,i;
    for(i=0;i<=N;i++) { d[i]=inf; t[i]=0; }
    d[S]=0;
    q.push({0,S});

    while(q.empty()==0)
    {
        cst=-q.top().first; nod=q.top().second; q.pop();
        for(i=0;i<v[nod].size();i++)
        {
            f=v[nod][i];
            if(d[f]>cst+cs[nod][f] && cp[nod][f]>0)
            {
                d[f]=cst+cs[nod][f];
                t[f]=nod;
                q.push({-d[f],f});
            }
        }
    }
    return d[D];
}
void flux()
{
    int i,j,f,cost,minim,r=0;
    while(dijkstra()!=inf)
    {
        cout<<"2";
        cout<<"m:"<<d[D]<<"\n";
        cout<<"1";
        for(i=0;i<v[D].size();i++)
        {

            f=v[D][i];

            if(d[f]!=inf && cp[f][D]>0)
            {
                f=D; minim=inf; cost=0;
                while(f!=S)
                {
                    minim=min(minim,cp[t[f]][f]);
                    cost+=cs[t[f]][f];
                    f=t[f];

                }
                f=D;
                while(f!=S)
                {
                    cp[t[f]][f]-=minim;
                    cp[f][t[f]]+=minim;
                    f=t[f];
                }
                r+=minim*cost;
            }
        }
        cout<<"2";
    }
    cout<<r<<"\n";
}



int main()
{
    int a,b,c,i,j,p;
    fin>>N>>M>>S>>D;
    for(i=1;i<=M;i++)
    {
        fin>>a>>b>>c>>p;
        v[a].push_back(b);
        v[b].push_back(a);
        cs[a][b]=p;cs[b][a]=p;
        cp[a][b]=c;
    }
    flux();
}