Cod sursa(job #1333729)

Utilizator Eugen_VlasieFMI Vlasie Eugen Eugen_Vlasie Data 3 februarie 2015 15:28:18
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include <fstream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
ifstream f("fmcm.in");
ofstream g("fmcm.out");
vector<int> v[360];
int ma,cst,viz[352],n,m,S,D,dist[352],pred[352],i,flow[352][352],cost[352][352],a,b;
queue<int> q;
bool bellmanford()
{
    memset(viz,0,sizeof(viz));
    for(i=1;i<=n;i++)
        dist[i]=1000000000;
    q.push(S);
    dist[S]=0;
    while(!q.empty())
    {
        a=q.front();
        q.pop();
        viz[a]=0;
        for(vector<int>::iterator it=v[a].begin();it!=v[a].end();it++)
        {
            b=*it;
            if(dist[b]>dist[a]+cost[a][b]&&flow[a][b])
            {
                dist[b]=dist[a]+cost[a][b];
                pred[b]=a;
                if(!viz[b])
                {
                    viz[b]++;
                    q.push(b);
                }
            }
        }
    }
    if(dist[D]==1000000000)
        return false;
    return true;
}
int main()
{
    f>>n>>m>>S>>D;
    for(i=1;i<=m;i++)
    {
        f>>a>>b;
        f>>flow[a][b]>>cost[a][b];
        cost[b][a]=-cost[a][b];
        v[a].push_back(b);
        v[b].push_back(a);
    }
    while(bellmanford())
    {
        ma=1000000000;
        a=D;
        while(a!=S)
        {
            if(ma>flow[pred[a]][a])
                ma=flow[pred[a]][a];
            a=pred[a];
        }
        a=D;
        while(a!=S)
        {
            flow[pred[a]][a]-=ma;
            flow[a][pred[a]]+=ma;
            a=pred[a];
        }
        cst+=ma*dist[D];
    }
    g<<cst<<'\n';
    return 0;
}