Cod sursa(job #1600207)

Utilizator AndreiGrigorasAndrei Grigoras AndreiGrigoras Data 14 februarie 2016 19:33:07
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.85 kb
#include<cstdio>
#include<vector>
#include<queue>
#include<bitset>
using namespace std;
#define MAX_N 355
#define Inf 0x3f3f3f3f
vector<short int>G[MAX_N];
int dist[MAX_N];
short int S,D,N,M;
short int cst[MAX_N][MAX_N];
short int capac[MAX_N][MAX_N];
bitset<MAX_N>viz;
queue<int>Q;
short int tata[MAX_N];
int Sum;
short int min(const short int &a, const short int &b)
{
    return (a>b)?(b):(a);
}
void flux()
{
    int x, y, flmin;
    int i;
    for(;;)
    {
        Q.push(S);
        for(i=1;i<=N;++i)
        {
            dist[i] = Inf;
            viz[i] = 0;
        }
        dist[S] = 0;
        for(;!Q.empty();Q.pop())
        {
            x = Q.front();
            viz[x] = 0;
            for(i=0;i<G[x].size();++i)
            {
                y = G[x][i];
                if(capac[x][y] && dist[y] > dist[x] + cst[x][y])
                {
                    dist[y] = dist[x] + cst[x][y];
                    tata[y] = x;
                    if(!viz[y])
                    {
                        viz[y] = 1;
                        Q.push(y);
                    }
                }
            }
        }
        if(dist[D] == Inf) return;
        flmin = Inf;
        for(i=D;i!=S;i=tata[i])
            flmin = min(flmin,capac[tata[i]][i]);
        for(i=D;i!=S;i=tata[i])
        {
            capac[tata[i]][i] -= flmin;
            capac[i][tata[i]] += flmin;
        }
        Sum += flmin * dist[D];
    }
}
int main()
{
    freopen("fmcm.in","r",stdin);
    freopen("fmcm.out","w",stdout);
    scanf("%hd%hd%hd%hd",&N,&M,&S,&D);
    int i;
    short int x,y,capacitate,cost;
    for(i=1;i<=M;++i)
    {
        scanf("%hd%hd%hd%hd",&x,&y,&capacitate,&cost);
        cst[x][y] = cost;
        cst[y][x] = -cost;
        capac[x][y] = capacitate;
        G[x].push_back(y);
        G[y].push_back(x);
    }
    flux();
    printf("%d\n",Sum);
    return 0;
}