Cod sursa(job #1557288)

Utilizator Liviu98Dinca Liviu Liviu98 Data 27 decembrie 2015 09:56:58
Problema Flux maxim de cost minim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2.05 kb
/*
    Flux maxim de cost minim intr-o retea de transport
    Complexitate:O(N2*M2) pentru 50 de pct
    D. Liviu
*/
#include <iostream>
#include <stdio.h>
#include <deque>
#include <vector>
#include <queue>
#include <cstring>
#define NMax 510
#define INFINIT 0x3f3f3f3f3f
using namespace std;
vector<int> Graf[NMax];
int N,M,S,D,Cap[NMax][NMax],Flux[NMax][NMax],Cost[NMax][NMax];
int tata[NMax],Dis[NMax],C[NMax],sol,x,y,z,cap,CostMin;
deque<int> Q;
bool mark[NMax];

void Read()
{
    scanf("%d%d%d%d",&N,&M,&S,&D);
    for(int i=1;i<=M;i++)
    {
        scanf("%d%d%d%d",&x,&y,&cap,&z);
        Graf[x].push_back(y);
        Graf[y].push_back(x);
        Cap[x][y]=cap;
        Cost[x][y]=z;Cost[y][x]=-z;
    }
}

inline bool Bellman(int nodStart)
{
    Q.push_back(nodStart);
    memset(C,0,sizeof(C));memset(tata,0,sizeof(tata));memset(Dis,INFINIT,sizeof(Dis));
    Dis[nodStart]=0,C[nodStart]=1;
    while(Q.empty()==false)
    {
        int nod=Q.front();
        Q.pop_front();
        C[nod]=0;
        for(vector<int>::iterator it=Graf[nod].begin();it!=Graf[nod].end();it++)
          if (Dis[*it]>Dis[nod]+Cost[nod][*it] && Cap[nod][*it]>0)
          {
              tata[*it]=nod;
              Dis[*it]=Dis[nod]+Cost[nod][*it];
              if(!C[*it])
                Q.push_back(*it);
          }
    }
    return tata[D]!=0;
}

void Edmonds_Karp()
{
    while(Bellman(S))
    {
        int MaxFlow=INFINIT;
        for(int nod=D;tata[nod];nod=tata[nod])
            MaxFlow=(MaxFlow>Cap[tata[nod]][nod]?Cap[tata[nod]][nod]:MaxFlow);

        for(int nod=D;tata[nod];nod=tata[nod])
        {
            Cap[tata[nod]][nod]=Cap[tata[nod]][nod]-MaxFlow;
            Cap[nod][tata[nod]]=Cap[nod][tata[nod]]+MaxFlow;
            Flux[tata[nod]][nod]=Flux[tata[nod]][nod]+MaxFlow;
            CostMin=CostMin+Cost[tata[nod]][nod]*MaxFlow;
        }
    }
    printf("%d",CostMin);
}

int main()
{
    freopen("fmcm.in","r",stdin);
    freopen("fmcm.out","w",stdout);
    Read();
    Edmonds_Karp();
}