Cod sursa(job #3183353)

Utilizator AndreidreiGresoiu Liviu-Andrei Andreidrei Data 11 decembrie 2023 16:25:21
Problema Flux maxim de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.09 kb
#include <bits/stdc++.h>
#include <cstring>
#include <cstdio>
#pragma GCC optimize ("O3")
#define din cin
#define dout out
#define pi 3.14159265359
#define sw(x,y) x^=y,y^=x,x^=y
#define bmin(a,b)((a<b)?(a):(b))
#define bmax(a,b)((a>b)?(a):(b))
#define bminify(a,b)a=bmin(a,b)
#define bmaxify(a,b)a=bmax(a,b)
#define forq(i,ii,n)for(i=ii;i<n;i++)
//#define f first
#define s second
#define mod 1000000007ll
#define nmax 2000002
#define lim 351
using namespace std;
typedef long long ll;
ifstream in("fmcm.in");
ofstream out("fmcm.out");
//FILE *fin=fopen("infasuratoare.in","r");
//FILE *fout=fopen("infasuratoare.out","w");
int n,m,v[351][351],c0[351][351],c1[351][351],i,j,k,l,n0,n1,d[351],e[351],c[351*351],f[351],s;
vector<int>g[351];
int main()
{
in>>n>>m>>n0>>n1;
for(k=0;k<m;k++)in>>i>>j,in>>v[i][j]>>c0[i][j],c0[j][i]=-c0[i][j],g[i].emplace_back(j),g[j].emplace_back(i);
fill(d,d+351,LLONG_MAX);
d[n0]=0,c[0]=n0,l=1;
while(l)
{
    i=c[0]&511,j=c[0]>>9;
    pop_heap(c,c+l,greater<int>()),l--;
    if(d[i]==j)
    {
        for(auto j:g[i])
            if(v[i][j]&&d[i]+c0[i][j]<d[j])
                d[j]=d[i]+c0[i][j],c[l++]=j+512*d[j],push_heap(c,c+l,greater<int>());
    }
}
//for(i=1;i<=n;i++)cout<<d[i]<<' ';
for(i=1;i<=n;i++)
    for(auto j:g[i])
        c1[i][j]=c0[i][j]+d[i]-d[j];
while(true)
{
    fill(d,d+351,INT_MAX),fill(e,e+351,INT_MAX);
    d[n0]=e[n0]=0,c[0]=n0,l=1,f[n1]=0;
    while(l)
    {
        i=c[0]&511,j=c[0]>>9;
        pop_heap(c,c+l,greater<int>()),l--;
        if(d[i]==j)
        {
            for(auto j:g[i])
                if(v[i][j]&&d[i]+c1[i][j]<d[j])
                    d[j]=d[i]+c1[i][j],c[l++]=j+512*d[j],e[j]=e[i]+c0[i][j],push_heap(c,c+l,greater<int>()),f[j]=i;
        }
    }
    if(f[n1])
    {
        k=INT_MAX;
        for(i=n1;i!=n0;i=f[i])bminify(k,v[f[i]][i]);
        for(i=n1;i!=n0;i=f[i])v[f[i]][i]-=k,v[i][f[i]]+=k;
        //cout<<k;
        s+=k*e[n1];
        for(i=1;i<=n;i++)
            for(auto j:g[i])
                c1[i][j]=c0[i][j]+e[i]-e[j];
    }
        else break;
}
out<<s;
}