Cod sursa(job #2739397)

Utilizator hhhhhhhAndrei Boaca hhhhhhh Data 8 aprilie 2021 10:00:06
Problema Flux maxim de cost minim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.61 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("fmcm.in");
ofstream fout("fmcm.out");
int n,m,S,D,c[355][355],cost[355][355],dist[355],from[355],Q[1000005],use[1000005];
vector<int> muchii[355];
bool drum=0;
int INF=1e9;
int BellmanFord()
{
    int L=0;
    for(int i=1;i<=n;i++)
    {
        dist[i]=INF;
        use[i]=0;
        from[i]=0;
    }
    dist[S]=0;
    use[S]=1;
    Q[++L]=S;
    for(int i=1;i<=L;i++)
    {
        int nod=Q[i];
        for(auto j:muchii[nod])
            if(c[nod][j]>0&&dist[j]>dist[nod]+cost[nod][j])
            {
                dist[j]=dist[nod]+cost[nod][j];
                from[j]=nod;
                if(!use[j])
                {
                    Q[++L]=j;
                    use[j]=1;
                }
            }
        use[nod]=0;
    }
    if(dist[D]==INF)
        return 0;
    drum=1;
    int cap=INF;
    for(int nod=D;nod!=S;nod=from[nod])
        cap=min(cap,c[from[nod]][nod]);
    for(int nod=D;nod!=S;nod=from[nod])
    {
        c[from[nod]][nod]-=cap;
        c[nod][from[nod]]+=cap;
    }
    return dist[D]*cap;
}
int flux()
{
    int rez=0;
    drum=1;
    while(drum)
    {
        drum=0;
        rez+=BellmanFord();
    }
    return rez;
}
int main()
{
    ios_base::sync_with_stdio(false);
    fin.tie(0);
    fout.tie(0);
    fin>>n>>m>>S>>D;
    for(int i=1;i<=m;i++)
    {
        int a,b;
        fin>>a>>b;
        muchii[a].push_back(b);
        muchii[b].push_back(a);
        fin>>c[a][b]>>cost[a][b];
        cost[b][a]=-cost[a][b];
    }
    fout<<flux();
    return 0;
}