Cod sursa(job #2124549)

Utilizator bleo16783FMI Bleotiu Cristian bleo16783 Data 7 februarie 2018 12:49:26
Problema Flux maxim de cost minim Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.87 kb
#include <iostream>
#include<fstream>
#include<queue>
#include<vector>
using namespace std;
#define N 400
#define pb push_back
#define inf 999999999
#define mp make_pair
#define f first
#define s second
int C[N][N],t[N],F[N][N],fm,cm,d[N],i,j,n,m,x,y,S,D,c,z,it,cst[N][N],sel[N],ans;
class cmp
{
public:
    bool operator () (int x,int y)
    {
        return(d[x]<d[y]);
    }
};
vector<pair<int,int> >a[N];
priority_queue<int,vector<int>,cmp >pq;
bool dijkstra(int S,int D)
{
    int cost;
    for(i=0;i<n;++i)
    {
        sel[i+1]=0;
        d[i+1]=inf+1;
        t[i+1]=0;
    }
    d[S]=0;
    pq.push(S);
    sel[S]=1;
    while(!pq.empty())
    {
        x=pq.top();
        pq.pop();
        if(x==D)continue;
        for(i=0;i<a[x].size();++i)
        {
            y=a[x][i].f;
            cost=a[x][i].s;
            if(!sel[y] && C[x][y]>F[x][y] && d[y]>d[x]+cost)
            {
                t[y]=x;
                d[y]=d[x]+cost;
                pq.push(y);
            }
        }
    }
    if(d[D]>inf)return 0;
    return 1;
}
int main()
{
    ifstream f("fmcm.in");
    f>>n>>m>>S>>D;
    for(i=0;i<m;++i)
    {
        f>>x>>y>>c>>z;
        cst[x][y]=z;
        cst[y][x]=-z;
        C[x][y]=c;
        a[x].pb(mp(y,z) );
        a[y].pb(mp(x,z) );
    }
    while(dijkstra(S,D))
    {
        for(it=0;it<a[D].size();++it)
        {
            x=a[D][it].f;
            if(d[x]>inf||C[x][D]==F[x][D])continue;
            t[D]=x;
            fm=inf;
            for(i=D;i!=S;i=t[i])
                fm=min(fm,C[t[i]][i]-F[t[i]][i]);
            if(!fm)continue;
            for(i=D;i!=S;i=t[i])
            {
                F[t[i]][i]+=fm;
                F[i][t[i]]-=fm;
                ans+=fm*cst[t[i]][i];
            }
        }
    }
    ofstream g("fmcm.out");
    g<<ans;
    return 0;
}