Cod sursa(job #1128492)

Utilizator Eugen_VlasieFMI Vlasie Eugen Eugen_Vlasie Data 27 februarie 2014 17:20:22
Problema Flux maxim de cost minim Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 3.44 kb
#include <fstream>
#include <cstring>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
ifstream f("fmcm.in");
ofstream g("fmcm.out");
long long csm,ok[355],cost[355][355],pred[355],nd1,d1,nd2,d2,dist[355],pi,pf,n,m,i,j,c,x,y,z,fl[355][355],cst[355][355];
vector<long long> b[355];
vector<long long> a[355];
queue<long long> q;
pair<long long,long long> per1,per2,rez[355];
priority_queue<pair<long long,long long>,vector<pair<long long,long long> >,greater<pair<long long,long long> > > Q;
long long cmp(pair<long long,long long> nr1,pair <long long,long long> nr2)
{
    if(nr1.first>nr2.first)
        return 0;
    return 1;
}
int main()
{
    f>>n>>m>>pi>>pf;
    for(i=1;i<=m;i++)
    {
        f>>x>>y>>c>>z;
        a[x].push_back(y);
        b[x].push_back(y);
        a[y].push_back(x);
        fl[x][y]=c;
        cst[x][y]=z;
        cost[x][y]=z;
        cost[y][x]=-z;
    }
    for(i=1;i<=n+1;i++)
        dist[i]=355000;
    q.push(pi);
    dist[pi]=0;
    while(!q.empty())
    {
        nd1=q.front();
        q.pop();
        for(vector<long long>::iterator it=b[nd1].begin();it!=b[nd1].end();it++)
        {
            nd2=*it;
            if(dist[nd1]+cst[nd1][nd2]<dist[nd2])
            {
                dist[nd2]=dist[nd1]+cst[nd1][nd2];
                q.push(nd2);
            }
        }
    }
    for(i=1;i<=n;i++)
    {
        for(vector<long long>::iterator itt=b[i].begin();itt!=b[i].end();itt++)
        {
            nd1=*itt;
            cst[i][nd1]+=(dist[i]-dist[nd1]);
            cst[nd1][i]=-cst[i][nd1];
        }
    }
    j=1;
    while(j)
    {
        for(i=1;i<=n;i++)
        {
            dist[i]=355000;
        }
        Q.push(pair<long long,long long>(0,pi));
        dist[pi]=0;
        pred[pi]=0;
        pred[pf]=0;
        while(!Q.empty())
        {
            per1=Q.top();
            Q.pop();
            nd1=per1.second;
            if(!ok[nd1])
            {
                ok[nd1]++;
                for(vector<long long>::iterator ii=a[nd1].begin();ii!=a[nd1].end();ii++)
                {
                    nd2=*ii;
                    if(dist[nd1]+cst[nd1][nd2]<dist[nd2]&&fl[nd1][nd2])
                    {
                        dist[nd2]=dist[nd1]+cst[nd1][nd2];
                        pred[nd2]=nd1;
                        Q.push(pair<long long,long long>(dist[nd2],nd2));
                    }
                }
            }
        }
        memset(ok,0,sizeof(ok));
        if(!pred[pf])
        {
            g<<csm<<'\n';
            return 0;
        }
        else
        {
            x=1;
            for(vector<long long>::iterator con=a[pf].begin();con!=a[pf].end();con++)
            {
                y=*con;
                if(dist[y]!=355000)
                {
                    rez[x++]=pair<long long,long long>(dist[y]+cst[y][pf],y);
                }
            }
            x--;
            sort(rez+1,rez+x+1,cmp);
            y=10001;
            x=pf;
            while(pred[pf])
            {
                if(fl[pred[pf]][pf]<y)
                    y=fl[pred[pf]][pf];
                pf=pred[pf];
            }
            pf=x;
            while(pred[x])
            {
                fl[pred[x]][x]-=y;
                fl[x][pred[x]]+=y;
                csm+=cost[pred[x]][x]*y;
                x=pred[x];
            }
        }
    }
    return 0;
}