Cod sursa(job #1543051)

Utilizator fanache99Constantin-Buliga Stefan fanache99 Data 5 decembrie 2015 21:44:22
Problema Flux maxim de cost minim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2.87 kb
#include<cstdio>
#include<vector>
#define inf 2000000000
#include<queue>
using namespace std;
vector<int> g[400];
int flow[400][400],capacity[400][400],cost[400][400],n,s,d,old[400],real[400],best[400],in_queue[400],dad[400];
queue<int> q;
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > h;
int minim(int a,int b){
    if(a<b)
        return a;
    return b;
}
void bellman_ford(){
    int i,dim,node;
    for(i=1;i<=n;i++)
        old[i]=inf;
    old[s]=0;
    q.push(s);
    in_queue[s]=1;
    while(!q.empty()){
        node=q.front();
        q.pop();
        in_queue[node]=0;
        dim=g[node].size();
        for(i=0;i<dim;i++){
            if(capacity[node][g[node][i]]==flow[node][g[node][i]])
                continue;
            if(old[g[node][i]]>old[node]+cost[node][g[node][i]]){
                old[g[node][i]]=old[node]+cost[node][g[node][i]];
                if(in_queue[g[node][i]]==0){
                    in_queue[g[node][i]]=1;
                    q.push(g[node][i]);
                }
            }
        }
    }
}
int dijkstra(){
    int i,dim,node,current,distance;
    for(i=1;i<=n;i++)
        best[i]=inf;
    best[s]=real[s]=0;
    h.push(make_pair(s,best[s]));
    while(!h.empty()){
        node=h.top().first;
        current=h.top().second;
        dim=g[node].size();
        h.pop();
        if(best[node]!=current)
            continue;
        for(i=0;i<dim;i++){
            if(capacity[node][g[node][i]]==flow[node][g[node][i]])
                continue;
            distance=current+cost[node][g[node][i]]+old[node]-old[g[node][i]];
            if(distance<best[g[node][i]]){
                best[g[node][i]]=distance;
                real[g[node][i]]=real[node]+cost[node][g[node][i]];
                dad[g[node][i]]=node;
                h.push(make_pair(g[node][i],best[g[node][i]]));
            }
        }
    }
    if(best[d]==inf)
        return 0;
    for(i=1;i<=n;i++)
        old[i]=real[i];
    return 1;
}
int main(){
    freopen("fmcm.in","r",stdin);
    freopen("fmcm.out","w",stdout);
    int m,x,y,a,b,i,node,add,maxflow=0,mincost=0;
    scanf("%d%d%d%d",&n,&m,&s,&d);
    for(i=1;i<=m;i++){
        scanf("%d%d%d%d",&x,&y,&a,&b);
        g[x].push_back(y);
        g[y].push_back(x);
        cost[x][y]+=b;
        cost[y][x]-=b;
        capacity[x][y]+=a;
    }
    bellman_ford();
    while(dijkstra()==1){
        add=inf;
        node=d;
        while(node!=s){
            add=minim(add,capacity[dad[node]][node]-flow[dad[node]][node]);
            node=dad[node];
        }
        node=d;
        while(node!=s){
            flow[dad[node]][node]+=add;
            flow[node][dad[node]]-=add;
            node=dad[node];
        }
        maxflow+=add;
        mincost+=add*real[d];
    }
    printf("%d",mincost);
    return 0;
}