Cod sursa(job #2112793)

Utilizator sebi110Ciobanu Sebastian sebi110 Data 23 ianuarie 2018 20:57:39
Problema Flux maxim de cost minim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2.82 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#include <string.h>
#define nmax 351
#define INF 1000000000
using namespace std;
queue <int> q;
vector <int> v[nmax];
vector <int>::iterator it;
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],t[nmax],distv[nmax],cost[nmax][nmax],dist[nmax],d,distr[nmax];
char viz[nmax];
void BFS(int i)
{
    int nod;
    q.push(i);
    while(!q.empty())
    {
        nod=q.front();
        q.pop();
        viz[nod]=0;
        for(it=v[nod].begin();it!=v[nod].end();it++)
        {
            if(c[nod][*it]>0 && distv[*it]>distv[nod]+cost[nod][*it])
            {
                distv[*it]=distv[nod]+cost[nod][*it];
                if(viz[*it]==0)
                {
                    viz[*it]=1;
                    q.push(*it);
                }

            }
        }
    }
}
void dijkstra(int i)
{
    data z,aux;
    int noudist;
    z.cost=0;
    z.nod=i;
    h.push(z);
    while(!h.empty())
    {
        z=h.top();
        h.pop();
        if(dist[z.nod]==z.cost)
            for(it=v[z.nod].begin();it!=v[z.nod].end();it++)
                if(c[z.nod][*it])
                {
                    noudist=dist[z.nod]+cost[z.nod][*it]+distv[z.nod]-distv[*it];//noua distanta
                    if(dist[*it]>noudist )
                    {
                        t[*it]=z.nod;
                        dist[*it]=noudist;
                        distr[*it]=distr[z.nod]+cost[z.nod][*it];
                        aux.cost=dist[*it];
                        aux.nod=*it;
                        h.push(aux);
                    }
                }

    }
}
int main()
{
    int rez=0,m,i,x,y,flux,s,n;
    freopen("fmcm.in", "rt", stdin);
    freopen("fmcm.out", "wt", stdout);
    scanf("%d %d %d %d",&n, &m, &s, &d);
    for(i=1;i<=m;i++)
    {
        scanf("%d %d", &x,&y);
        scanf("%d %d", &c[x][y], &cost[x][y]);
        cost[y][x]=-cost[x][y];
        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(t,0,sizeof(t));
        for(i=1;i<=n;i++)
            dist[i]=INF;
        dist[s]=0;
        distr[s]=0;
        dijkstra(s);
        if(t[d]==0)
            break;
        for(i=1;i<=n;i++)
            distv[i]=distr[i];
        flux=INF;
        x=d;
        while(x!=s)
        {
            flux=min(flux,c[t[x]][x]);
            x=t[x];
        }
        x=d;
        rez+=flux*distr[d];
        while(x!=s)
        {
            c[t[x]][x]-=flux;
            c[x][t[x]]+=flux;
            x=t[x];
        }
    }
    cout<<rez<<'\n';
    return 0;
}