Cod sursa(job #3151508)

Utilizator Luca529Taschina Luca Luca529 Data 21 septembrie 2023 17:24:48
Problema Flux maxim de cost minim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.05 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>

using namespace std;
ifstream fin("fmcm.in");
ofstream fout("fmcm.out");
vector<int> x[401];
pair<int, int> h[401][401];
int dist[401], init[401][401], prec[401], p[401], sol;

int F(int a)
{int mini=1e6;
 while(prec[a]!=-1)
 {mini=min(mini, h[prec[a]][a].first);
  a=prec[a];
 }
 return mini;
}

void update(int a, int v)
{while(prec[a]!=-1)
 {h[prec[a]][a].first-=v, sol+=v*init[prec[a]][a];
  h[a][prec[a]].first+=v, sol-=v*init[a][prec[a]];
  a=prec[a];
 }
}

int main()
{   int n, m, a, b, c, d, s, f;
    fin>>n>>m>>s>>f;
    for(int i=1;i<=m;i++)
    {fin>>a>>b>>c>>d;
     init[a][b]=d;

     x[a].push_back(b), x[b].push_back(a);
     h[a][b]={c, d};
     h[b][a]={0, -d};
    }

    for(int i=1;i<=n;i++)
    prec[i]=-1, dist[i]=1e6;
    dist[s]=0, p[s]=1;

    queue<int> q;
    vector<int>:: iterator I;
    q.push(s);
    while(q.empty()!=1)
    {a=q.front();
     p[a]=0;
     for(I=x[a].begin();I<x[a].end();I++)
     if(h[a][*I].first>0 && dist[*I]>dist[a]+h[a][*I].second)
     {prec[*I]=a;
      dist[*I]=dist[a]+h[a][*I].second;
      if(p[*I]==0)p[*I]=1, q.push(*I);
     }
     q.pop();
    }

    if(dist[f]!=1e6)
    {int v=F(f);
     update(f, v);

     for(int i=1;i<=n;i++)
     for(I=x[i].begin();I<x[i].end();I++)
     h[i][*I].second+=dist[i]-dist[*I];
    }

    while(dist[f]!=1e6)
    {for(int i=1;i<=n;i++)
     dist[i]=1e6, prec[i]=-1, p[i]=0;
     dist[s]=0;

     q.push(s), p[s]=1;

     while(q.empty()!=1)
     {a=q.front();
      p[a]=0;

      for(I=x[a].begin();I<x[a].end();I++)
      if(h[a][*I].first>0 && dist[*I]>dist[a]+h[a][*I].second)
      {dist[*I]=dist[a]+h[a][*I].second, prec[*I]=a;
       if(p[*I]==0)p[*I]=1, q.push(*I);
      }
      q.pop();
     }

     if(dist[f]!=1e6)
     {int v=F(f);
      update(f, v);

      for(int i=1;i<=n;i++)
      for(I=x[i].begin();I<x[i].end();I++)
      h[i][*I].second+=dist[i]-dist[*I];
     }
    }

    fout<<sol;
    return 0;
}