Cod sursa(job #2670927)

Utilizator De_Azi_Ne_DopamAlex Ardelean De_Azi_Ne_Dopam Data 10 noiembrie 2020 22:43:06
Problema Flux maxim de cost minim Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.68 kb
#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
using namespace std;
const int N=350;
int C[N+1][N+1];
int cost[N+1][N+1];
int dist[N+1];
int tata[N+1],n;
int s,d;
bool incoada[N+1];
vector <int> v[N+1];
queue <int> pq;
bool bfs()
{
    for(int i=1; i<=n; i++)
        dist[i]=1e9;
    pq.push(s);
    dist[s]=0;
    incoada[s]=1;
    while(!pq.empty())
    {
        int x=pq.front();
        pq.pop();
        incoada[x]=0;
        for(auto it:v[x])
            if(C[x][it]&&dist[x]+cost[x][it]<dist[it])
            {
                dist[it]=dist[x]+cost[x][it];
                if(!incoada[it])
                {
                    pq.push(it);
                    incoada[it]=1;
                }
                tata[it]=x;
            }
    }
    return (dist[d]!=1e9);
}
int main()
{
#ifndef HOME
    freopen("fmcm.in","r",stdin);
    freopen("fmcm.out","w",stdout);
#endif // HOME
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
    int m,i,a,b,c,d1;
    cin>>n>>m>>s>>d;
    for(i=1; i<=m; i++)
    {
        cin>>a>>b>>c>>d1;
        v[a].push_back(b);
        v[b].push_back(a);
        C[a][b]=c;
        cost[a][b]=d1;
        cost[b][a]=-d1;
    }
    int sum=0;
    while(bfs())
    {
        int min1=1e9;
        for(int j=d; j!=s; j=tata[j])
            min1=min(min1,C[tata[j]][j]);
        if(min1!=0)
            for(int j=d; j!=s; j=tata[j])
            {
                C[tata[j]][j]-=min1;
                C[j][tata[j]]+=min1;
            }
        sum+=min1*dist[d];
    }
    cout<<sum;
    return 0;
}