Cod sursa(job #3156292)

Utilizator AndreidreiGresoiu Liviu-Andrei Andreidrei Data 11 octombrie 2023 09:17:45
Problema Flux maxim de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.19 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 777777777ll
#define nmax 351
using namespace std;
typedef long long ll;
//ifstream in("ghicit.in");
//ofstream out("cuba.out");
FILE *fin=fopen("fmcm.in","r");
FILE *fout=fopen("fmcm.out","w");
int n,m,n1,n2,i,j,k,l,o[nmax][nmax],c[nmax][nmax],d[nmax],q[nmax*nmax],o2[nmax][nmax],f[nmax],e[nmax];
vector<int>g[nmax];ll tf,tc;
int main()
{
fscanf(fin,"%d%d%d%d",&n,&m,&n1,&n2);
for(k=0;k<m;k++)fscanf(fin,"%d%d",&i,&j),fscanf(fin,"%d%d",&c[i][j],&o[i][j]),o[j][i]=-o[i][j],g[i].emplace_back(j),g[j].emplace_back(i);
fill(d,d+n+1,INT_MAX);
d[n1]=0,q[0]=n1,l=1;
while(l)
{
    i=q[0],k=i>>10,i-=k<<10;
    pop_heap(q,q+l,greater<int>()),l--;
    //cout<<l<<' '<<i<<' '<<k<<'\n';
    if(d[i]==k)
        {
        for(auto j:g[i])
            if(c[i][j])
                if(d[j]>d[i]+o[i][j])
                    d[j]=d[i]+o[i][j],q[l++]=j+(d[j]<<10),push_heap(q,q+l,greater<int>());}
}
//for(i=1;i<=n;i++)cout<<i<<' '<<d[i]<<'\n';
for(i=1;i<=n;i++)
    for(auto j:g[i])
        o2[i][j]=o[i][j]+d[i]-d[j];
while(true)
{
    fill(d,d+n+1,INT_MAX),d[n1]=0,q[0]=n1,l=1,f[n2]=0;
    while(l)
    {
        i=q[0],k=i>>10,i-=k<<10;
        pop_heap(q,q+l,greater<int>()),l--;
        //cout<<l<<' '<<i<<' '<<k<<'\n';
        if(d[i]==k)
            {
            for(auto j:g[i])
                if(c[i][j]&&d[j]>d[i]+o2[i][j])
                    d[j]=d[i]+o2[i][j],e[j]=e[i]+o[i][j],f[j]=i,q[l++]=j+(d[j]<<10),push_heap(q,q+l,greater<int>());}
    }
    if(f[n2]==0)
        break;
        else{
        k=INT_MAX;
        for(i=n2;i!=n1;i=f[i])bminify(k,c[f[i]][i]);
        tf+=k,tc+=k*e[n2];
        for(i=n2;i!=n1;i=f[i])c[f[i]][i]-=k,c[i][f[i]]+=k;
        for(i=1;i<=n;i++)
            for(auto j:g[i])
                o2[i][j]=o[i][j]+e[i]-e[j];
    }
}
fprintf(fout,"%d",tc);
}