Cod sursa(job #2174924)

Utilizator albucristianAlbu Cristian-Gabriel albucristian Data 16 martie 2018 14:16:25
Problema Flux maxim de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.16 kb
#include <bits/stdc++.h>
using namespace std;
vector <int> graf[355];
int drum[355],flux[355][355],cost[355][355],tata[355],co[355];
bitset <355> viz;
int n,m,nod,q,coo,ok,s,d,a,b,mi;
int bfs()
{
    ok=0;
    viz.reset();
    viz[s]=1;
    queue <int> coada;
    coada.push(s);
    while(!coada.empty())
    {
        nod=coada.front();
        coada.pop();
        for(int i=0;i<graf[nod].size();i++)
        {
            if(graf[nod][i]!=d)
            {
                if((!viz[graf[nod][i]]||co[graf[nod][i]]>co[nod]+cost[nod][graf[nod][i]])&&flux[nod][graf[nod][i]]>0)
                {
                    viz[graf[nod][i]]=1;
                    coada.push(graf[nod][i]);
                    co[graf[nod][i]]=co[nod]+cost[nod][graf[nod][i]];
                    tata[graf[nod][i]]=nod;
                }
            }
            else
            {
                if(flux[nod][graf[nod][i]]>0)
                    ok=1;
            }
        }
    }
    return ok;
}
int main()
{
    ifstream in("fmcm.in");
    ofstream out("fmcm.out");
    in>>n>>m>>s>>d;
    for(int i=1;i<=m;i++)
    {
        in>>a>>b;
        in>>flux[a][b]>>cost[a][b];
        cost[b][a]=-cost[a][b];
        graf[a].push_back(b);
        graf[b].push_back(a);
    }
    coo=0;
    while(bfs())
    {
        mi=0;
        for(int i=0;i<graf[d].size();i++)
        {
            q=graf[d][i];
            mi=flux[q][d];
            while(tata[q])
            {
                if(flux[tata[q]][q]<mi)
                {
                    mi=flux[tata[q]][q];
                }
                q=tata[q];
            }
            if(mi>0)
            {
                q=graf[d][i];
                coo+=cost[q][d];
                flux[q][d]-=mi;
                flux[d][q]+=mi;
                while(tata[q])
                {
                    flux[tata[q]][q]-=mi;
                    flux[q][tata[q]]+=mi;
                    coo+=cost[tata[q]][q];
                    q=tata[q];
                }
            }
        }
        for(int i=1;i<=n;i++)
        {
            co[i]=0;
        }
    }
    out<<coo;
    return 0;
}