Cod sursa(job #1816836)

Utilizator GeanaVladGeana Vlad GeanaVlad Data 26 noiembrie 2016 23:17:09
Problema Flux maxim de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.4 kb
#include <iostream>
#include<fstream>
#include<vector>
#define inf 1000000
using namespace std;
ifstream f("maxflow.in");
ofstream gout("maxflow.out");
int z,sz,c[1000000],C[1001][1001],F[1001][1001],k,i,flow,fmin,n,m,father[1001],x,y,cst,w[1001],e[1001],j,nod,vertex,noduri,S,D;
vector<int>v[1001],g[1001],q;
bool viz[1001];
void sterge(int j)
{
    swap(q[j],q[q.size()-1]);
    q.pop_back();
}
int functie(int i,int j,int c)
{
    if(w[j]>w[i]+c)
    {
        w[j]=w[i]+c;
        return 1;
    }
    return 0;
}
int bfs()
{
    sz=1;
    c[1]=S;
    int i,nod;
    for(i=1; i<=n; i++)
        viz[i]=0;
    viz[S]=1;
    for(i=1; i<=sz; i++)
    {
        nod=c[i];
        for(k=0; k<v[nod].size(); k++)
        {
            int vertex=v[nod][k];
            if(viz[v[nod][k]] || F[nod][v[nod][k]]==0)
                continue;
            c[++sz]=v[nod][k];
            viz[v[nod][k]]=1;
            father[v[nod][k]]=nod;
            if(v[nod][k]==D)
                return 1;
        }
    }
    return 0;
}
int main()
{
    f>>n>>m>>S>>D;
    for(i=1; i<=m; i++)
    {
        f>>x>>y>>cst>>z;
        v[x].push_back(y);
        v[y].push_back(x);
        F[x][y]=cst;
        C[x][y]=z;
    }
    for(flow=0; bfs(); flow+=fmin)
    {
        fmin=inf;
        for(i=D; i!=S; i=father[i])
            fmin=min(fmin,F[father[i]][i]);
        for(i=D; i!=S; i=father[i])
        {
            F[father[i]][i]-=fmin;
            F[i][father[i]]+=fmin;
        }
    }
    //gout<<flow<<'\n';
    q.push_back(0);
    q.push_back(S);
    for(i=1; i<q.size(); i++)
    {
        nod=q[i];
        for(k=0; k<v[nod].size(); k++)
        {
            vertex=v[nod][k];
            if(F[nod][vertex]==0)
                g[nod].push_back(vertex),q.push_back(vertex),noduri++;
        }
    }
    q.clear();
    //BELLMAN FORD
    for(i=1; i<=n; i++)
        w[i]=inf;
    w[S]=0;
    q.push_back(0);
    q.push_back(S);
    e[S]=1;
    for(i=1; i<noduri; i++)
        for(j=1; j<q.size(); j++)
        {
            nod=q[j];
            for(k=0; k<g[nod].size(); k++)
                if(functie(nod,g[nod][k],C[nod][g[nod][k]]))
                {
                    if(!e[g[nod][k]])
                        q.push_back(g[nod][k]),e[g[nod][k]]=1;
                }
            sterge(j);
            e[nod]=0;
        }
    gout<<w[D]<<' ';
}