Cod sursa(job #2112737)

Utilizator sebi110Ciobanu Sebastian sebi110 Data 23 ianuarie 2018 19:58:47
Problema Flux maxim de cost minim Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.95 kb
#include <fstream>
#include <vector>
#include <queue>
#include <string.h>
#define nmax 500
#define INF 1000000000
using namespace std;
ifstream fi("fmcm.in");
ofstream g("fmcm.out");
queue <int> q;
queue <int> vn;
vector <int> v[nmax];
struct data{
    int cost,nod;
    bool friend operator<(data a,data b)
    {
        return a.cost<b.cost;
    }
};
priority_queue <data> h;
int c[nmax][nmax],f[nmax][nmax],t[nmax],viz[nmax],distv[nmax],cost[nmax][nmax],dist[nmax],d;
void BFS(int i)
{
    int nod,vec;
    t[i]=-1;
    viz[i]=1;
    q.push(i);
    while(!q.empty())
    {
        nod=q.front();
        q.pop();
        viz[nod]=0;
        for(i=0;i<v[nod].size();i++)
        {
            vec=v[nod][i];
            if(distv[vec]>distv[nod]+cost[nod][vec] && c[nod][vec]-f[nod][vec]>0)
            {
                t[vec]=nod;
                if(viz[vec]==0)
                {
                    distv[vec]=distv[nod]+cost[nod][vec];
                    viz[vec]=1;
                    q.push(vec);
                }
            }
        }
    }
}
void dijkstra(int i)
{
    data z,aux;
    int nod,vec,noudist;
    z.cost=0;
    z.nod=i;
    h.push(z);
    while(!h.empty())
    {
        z=h.top();
        h.pop();
        if(z.nod==d)
            return;
        while(viz[z.nod]!=0 && !h.empty())
        {
            z=h.top();
            h.pop();
        }
        if(viz[z.nod]==0)
        {
            viz[z.nod]=1;
            nod=z.nod;
            for(i=0;i<v[nod].size();i++)
            {
                vec=v[nod][i];
                noudist=dist[nod]+cost[nod][vec]+distv[nod]-distv[vec];//noua distanta
                if(dist[vec]>noudist && c[nod][vec]-f[nod][vec]>0)
                {
                    t[vec]=nod;
                    dist[vec]=noudist;
                    aux.cost=dist[vec];
                    aux.nod=vec;
                    h.push(aux);
                }
            }
        }
    }
}
int main()
{
    int rez=0,m,i,x,y,flux,s,n,cos;
    fi>>n>>m>>s>>d;
    for(i=1;i<=m;i++)
    {
        fi>>x>>y>>flux>>cos;
        c[x][y]+=flux;
        cost[x][y]=cos;
        cost[y][x]=-cos;
        v[x].push_back(y);
        v[y].push_back(x);
    }
    for(i=1;i<=n;i++)
        distv[i]=INF;
    distv[s]=0;
    BFS(s);
    while(1)
    {
        memset(viz,0,sizeof(viz));
        memset(t,0,sizeof(t));
        for(i=1;i<=n;i++)
            dist[i]=INF;
        dist[s]=0;
        dijkstra(s);
        if(t[d]==0)
            break;
        flux=INF;
        x=d;
        while(x!=s)
        {
            flux=min(flux,c[t[x]][x]-f[t[x]][x]);
            x=t[x];
        }
        x=d;
        while(x!=s)
        {
            f[t[x]][x]+=flux;
            f[x][t[x]]-=flux;
            rez+=cost[t[x]][x]*flux;
            x=t[x];
        }
        for(i=1;i<=n;i++)
            distv[i]=dist[i];
    }
    g<<rez;
    return 0;
}