Cod sursa(job #1526652)

Utilizator sebinechitasebi nechita sebinechita Data 16 noiembrie 2015 22:54:47
Problema Flux maxim de cost minim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("fmcm.in");
ofstream fout("fmcm.out");
#define MAX 355
#define INF 2000000000
typedef vector <int> :: iterator iter;
vector <int> G[MAX];
int i, n, dist[MAX], dad[MAX];
int s, d, st, dr, q[MAX * MAX], F[MAX][MAX], C[MAX][MAX], Ca[MAX][MAX], flow;
int maxflow, m, x, y;
bool bfs()
{
    int nod;
    int i;
    for(i = 1 ; i <= n ; i++)
        dist[i] = INF;
    dist[s] = 0;
    st = 0;
    dr = 0;
    q[dr] = s;

    while(st <= dr)
    {

        nod = q[st++];
        //cout << nod << " " << dist[nod] << "\n";
        for(iter it = G[nod].begin() ; it != G[nod].end() ; it++)
        {
            if(F[nod][*it] < Ca[nod][*it] && dist[*it] > dist[nod] + C[nod][*it])
            {
                dist[*it] = dist[nod] + C[nod][*it];
                q[++dr] = *it;
                dad[*it] = nod;
            }
        }
    }
    flow = INF;
    for(int i = d ; dad[i] ; i = dad[i])
    {
        flow = min(flow, Ca[dad[i]][i] - F[dad[i]][i]);
    }
    for(int i = d ; dad[i] ; i = dad[i])
    {
       // maxflow += flow * C[dad[i]][i];
        F[dad[i]][i] += flow;
        F[i][dad[i]] -= flow;
    }
    if(dist[d] != INF)
    maxflow += flow * dist[d];
    return dist[d] != INF;
}

int main()
{
    fin >> n >> m >> s >> d;
    while(m--)
    {
        fin >> x >> y;
        fin >> Ca[x][y] >> C[x][y];
        C[y][x] = -C[x][y];
        G[x].push_back(y);
        G[y].push_back(x);
    }
    while(bfs())
    {

    }
    fout << maxflow << "\n";
}