Cod sursa(job #1563791)

Utilizator gapdanPopescu George gapdan Data 6 ianuarie 2016 18:25:32
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include <cstdio>
#include <vector>
#include <queue>
#define NMAX 1005
#define INF 999999999
using namespace std;

int n,m,x,y,c,i,j,cp,Min,s,d,nod,sol;
int dist[NMAX],tata[NMAX],viz[NMAX];
int flux[NMAX][NMAX],cap[NMAX][NMAX],cost[NMAX][NMAX];
vector<int>v[NMAX];
queue<int>q;

int BF()
{
    int i,x,y,c;
    for(i=1; i<=n; ++i)
    {
        dist[i]=INF;
        tata[i]=0;viz[i]=0;
    }
    q.push(s);dist[s]=0;
    while(!q.empty())
    {
        x=q.front();
        q.pop();
        viz[x]=0;
        for(i=0; i<v[x].size(); ++i)
        {
            y=v[x][i];
            c=cost[x][y];
            if (cap[x][y] > flux[x][y] && dist[y] > dist[x] + c)
            {
                dist[y]=dist[x]+c;
                tata[y]=x;
                if(!viz[y])
                {
                    viz[y]=1;
                    q.push(y);
                }
            }
        }
    }
    if (tata[d]) return 1;
        else return 0;
}

int main()
{
    freopen("fmcm.in","r",stdin);
    freopen("fmcm.out","w",stdout);
    scanf("%d%d%d%d",&n,&m,&s,&d);
    for(i=1; i<=m; ++i)
    {
        scanf("%d%d%d%d",&x,&y,&cp,&c);
        v[x].push_back(y);
        v[y].push_back(x);
        cap[x][y]=cp;
        cost[x][y]=c;cost[y][x]=-c;
    }

    while(BF())
    {
        Min=INF;
        for(nod=d; nod!=s; nod=tata[nod])
            Min=min(Min,cap[tata[nod]][nod] - flux[tata[nod]][nod]);

        for(nod=d; nod!=s; nod=tata[nod])
        {
            flux[tata[nod]][nod] += Min;
            flux[nod][tata[nod]] -= Min;
        }
        sol += dist[d] * Min;
    }
    printf("%d\n",sol);
    return 0;
}