Cod sursa(job #1301402)

Utilizator sebinechitasebi nechita sebinechita Data 25 decembrie 2014 21:55:51
Problema Flux maxim de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <conio.h>
using namespace std;
ifstream fin("fmcm.in");
ofstream fout("fmcm.out");
#define MAX 352
#define INF (1<<30)
typedef vector <int> :: iterator iter;
vector <int> G[MAX];
queue <int> Q;
int n, m, S, D, C[MAX][MAX], Ca[MAX][MAX], dist[MAX], p[MAX], F[MAX][MAX], maxflow, in_Q[MAX];
bool bf()
{
    int i, nod, minim;
    for( i = 1 ; i <= n ; i++)
    {
        dist[i] = INF;
    }
    dist[S] = 0;
    Q.push(S);
    in_Q[S] = 1;
    while(Q.size())
    {
        nod = Q.front();
        in_Q[nod] = 0;
        Q.pop();
        for(iter it = G[nod].begin() ; it != G[nod].end() ; it++)
        {
            if(dist[*it] > dist[nod] + C[nod][*it] && F[nod][*it] < Ca[nod][*it])
            {
                p[*it] = nod;
                dist[*it] = dist[nod] + C[nod][*it];
                if(!in_Q[*it])
                    Q.push(*it);
                in_Q[*it] = 1;
            }
        }
    }
    if(dist[D] == INF)
        return 0;
    minim = INF;
    nod = D;
    while(p[nod])
    {
        minim = min(minim, Ca[p[nod]][nod] - F[p[nod]][nod]);
        nod = p[nod];
    }
    nod = D;
    while(p[nod])
    {
        maxflow += minim * C[p[nod]][nod];
        F[p[nod]][nod] += minim;
        F[nod][p[nod]] -= minim;
        nod = p[nod];
    }
    return 1;
}

int main()
{
    int x, y, c, z;
    fin >> n >> m >> S >> D;

    while(m--)
    {
        fin >> x >> y >> c >> z;
        G[x].push_back(y);
        G[y].push_back(x);
        Ca[x][y] = c;
        C[x][y] = z;
        C[y][x] = -z;
    }

    while(bf())
    {

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