Cod sursa(job #1418856)

Utilizator ArchazeyBaltatu Andrei-Mircea Archazey Data 14 aprilie 2015 11:26:04
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.92 kb
#include<bits/stdc++.h>
using namespace std;

struct cell
{
    int nod,cost;
    bool operator <(const cell &e )const
        {
            return cost>e.cost;
        }
};

ifstream fin("fmcm.in");
ofstream fout("fmcm.out");

const int oo=1<<30;
const int NMAX=355;

int n,m,S,D,fl[NMAX][NMAX],ad[NMAX][NMAX],c[NMAX][NMAX];
int f[NMAX],dp[NMAX];
vector<int>v[NMAX];
vector<int>::iterator it;
priority_queue<cell>Q;

inline bool DIJKSTRA()
{
    int i;
    cell aux,kkt;
    for (i=1;i<=n;i++) f[i]=dp[i]=oo;
    dp[S]=0;
    aux.nod=S;aux.cost=0;
    Q.push(aux);
    while (!Q.empty())
        {
            aux=Q.top();
            Q.pop();
            if (aux.nod==D) continue;
            if (aux.cost==dp[aux.nod])
                {
                    for (it=v[aux.nod].begin();it!=v[aux.nod].end();it++)
                        if (dp[*it]>(aux.cost+c[aux.nod][*it]) && ad[aux.nod][*it]<fl[aux.nod][*it])
                            {
                                dp[*it]=aux.cost+c[aux.nod][*it];
                                f[*it]=aux.nod;
                                kkt.nod=*it;kkt.cost=dp[*it];
                                Q.push(kkt);
                            }
                }
        }
    if (f[D]==oo) return 0;
    return 1;
}

int main()
{
    int i,x,y,w,z,sol,mn;
    fin>>n>>m>>S>>D;
    for (i=1;i<=m;i++)
        {
            fin>>x>>y>>w>>z;
            fl[x][y]+=w;
            c[x][y]=z;c[y][x]=-z;
            v[x].push_back(y);
            v[y].push_back(x);
        }
    for (sol=0;DIJKSTRA();)
        {
            mn=oo;
            for (i=D;i!=S;i=f[i])
                mn=min(mn,fl[f[i]][i]-ad[f[i]][i]);
            for (i=D;i!=S;i=f[i])
                {
                    ad[f[i]][i]+=mn;
                    ad[i][f[i]]-=mn;
                }
            sol+=mn*dp[D];
        }
    fout<<sol<<"\n";
    return 0;
}