Cod sursa(job #2314023)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 7 ianuarie 2019 19:23:53
Problema Flux maxim de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.91 kb
#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
using namespace std;
#define X 351
int n,m,s,t,x,y,u[X][X],v[X][X],r,z,e[X],d[X],f[X],p[X];
vector<int> c[X];
char w[X];
queue<int> q;
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> h;
bool E()
{
    for(memset(d,0x3f,sizeof(d)),d[s]=f[s]=0,h.push(make_pair(d[s],s));!h.empty();)
    {
        int cst=h.top().first,nod=h.top().second;
        h.pop();
        if(d[nod]!=cst)
            continue;
        for(vector<int>::iterator it=c[nod].begin();it!=c[nod].end();it++)
            if(u[nod][*it])
            {
                int new_d=d[nod]+v[nod][*it]+e[nod]-e[*it];
                if(new_d<d[*it])
                    d[*it]=new_d,f[*it]=f[nod]+v[nod][*it],p[*it]=nod,h.push(make_pair(d[*it],*it));
            }
    }
    memcpy(e,f,sizeof(d));
    if(d[t]==0x3f3f3f3f)
        return false;
    int Min=0x3f3f3f3f,curCst=0;
    for(int aux=t;aux!=s;aux=p[aux])
        Min=min(Min,u[p[aux]][aux]),curCst+=v[p[aux]][aux];
    r+=Min,z+=Min*f[t];
    for(int aux=t;aux!=s;aux=p[aux])
        u[p[aux]][aux]-=Min,u[aux][p[aux]]+=Min;
    return true;
}
bool B()
{
    memset(e,0x3f,sizeof(e)),e[s]=0;
    for(q.push(s),w[s]=1;!q.empty();q.pop())
    {
        int i=q.front();
        w[i]=0;
        for(vector<int>::iterator it=c[i].begin();it!=c[i].end();it++)
            if(u[i][*it])
            {
                if(e[i]+v[i][*it]>=e[*it])
                    continue;
                e[*it]=e[i]+v[i][*it];
                if(w[*it])
                    continue;
                w[*it]=1,q.push(*it);
            }
    }
    return e[t]==0x3f3f3f3f?false:true;
}
int main()
{
    freopen("fmcm.in","r",stdin),freopen("fmcm.out","w",stdout),scanf("%d%d%d%d",&n,&m,&s,&t);
    while(m--)
        scanf("%d%d",&x,&y),c[x].push_back(y),c[y].push_back(x),scanf("%d%d",u[x]+y,v[x]+y),v[y][x]=-v[x][y];
    for(B();E(););
    printf("%d",z);
}