Cod sursa(job #3147959)

Utilizator AndreidreiGresoiu Liviu-Andrei Andreidrei Data 28 august 2023 15:44:42
Problema Flux maxim de cost minim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.28 kb
#include <bits/stdc++.h>
#include <cstring>
//#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 1000000297ll
#define smax 51000
using namespace std;
typedef long long ll;
//ifstream in("fmcm.in");
//ofstream out("fmcm.out");
FILE *fin=fopen("fmcm.in","r");
FILE *fout=fopen("fmcm.out","w");
int n,m,i,j,k,l,n1,n2,v0[351][351],v1[351][351],v2[351][351],d[351],e[351],f[351],w,ww;vector<int>g[351];
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>qu;
queue<int>c;bitset<351>b;ll tf,tc;
int main()
{
fscanf(fin,"%d%d%d%d",&n,&m,&n1,&n2);
forq(k,0,m)
    fscanf(fin,"%d%d",&i,&j),fscanf(fin,"%d%d",&v0[i][j],&v1[i][j]),g[i].push_back(j),g[j].push_back(i),v0[j][i]=-0,v1[j][i]=-v1[i][j];
//forq(i,0,n)for(auto j:g[i])printf("%d %d: %d %d %d %d\n",i,j,v[i][j][0],v[i][j][1],v[j][i][0],v[j][i][1]);
fill(d,d+n+1,INT_MAX/2);
d[n1]=0,c.push(n1),f[n1]=1;
while(l)
{
    i=c.front(),f[i]=0;c.pop();
    //printf("%d:%d\n",i,d[i]);
    for(auto j:g[i])
        if(v0[i][j])
            if(d[j]>d[i]+v1[i][j])
                {d[j]=d[i]+v1[i][j];if(f[j]==0)f[j]=1,c.push(f[j]);}
}
forq(i,1,n+1)for(auto j:g[i])v2[i][j]=v1[i][j]+d[i]-d[j];
while(true)
{
    memset(e,0x1f,sizeof(e)),f[n2]=0;
    b[n1]=1,e[n1]=0,l=1,qu.push(make_pair(0,n1));
    while(!qu.empty())
    {
        i=qu.top().s,w=qu.top().f;
        qu.pop();
        //pop_heap(c,c+l,greater<ll>());--l;
        if(e[i]==w)
        {

            for(auto j:g[i])
                if(v0[i][j])
                    {/*printf("%d %d %d\n",i,j,v2[i][j]);*/if(e[j]>e[i]+v2[i][j])
                        e[j]=e[i]+v2[i][j],f[j]=i,qu.push(make_pair(e[j],j));}
        }
    }
    if(f[n2]==0)break;
    else{
        j=n2,k=INT_MAX;//printf("fini");
        while(j!=n1)bminify(k,v0[f[j]][j]),j=f[j];
        //printf("pa%d\n",k);
        tf+=k,j=n2,i=0;
        while(j!=n1)
            v0[f[j]][j]-=k,v0[j][f[j]]+=k,tc+=v1[f[j]][j]*k,j=f[j];
    }
}
fprintf(fout,"%lld",tc);
fclose(fin),fclose(fout);
}