Cod sursa(job #726979)

Utilizator dicu_dariaDaria Dicu dicu_daria Data 27 martie 2012 17:46:54
Problema Flux maxim de cost minim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <fstream>
#include <vector>
#include <cstring>
#include <queue>
#define MAXN 400
using namespace std;
queue<int>Q;
long long cost;
int dist[MAXN],Cost[MAXN][MAXN],F[MAXN][MAXN],C[MAXN][MAXN],p[MAXN],fmin,s,d,n,m;
vector<int>v[MAXN];
bool inq[MAXN];
bool drum()
{
    int i,x;
    memset(p,0,sizeof(p));
    for(i=1;i<=n;i++) dist[i]=(int(2e9));
    dist[s]=0;
    inq[s]=1; Q.push(s);
    while(!Q.empty())
    {
        x=Q.front(); inq[x]=0; Q.pop();
        for(i=0;i<v[x].size();i++)
        if(dist[v[x][i]]>dist[x]+Cost[x][v[x][i]] and F[x][v[x][i]]-C[x][v[x][i]]<0)
        {
            dist[v[x][i]]=dist[x]+Cost[x][v[x][i]];
            p[v[x][i]]=x;
            if(!inq[v[x][i]])
            {
                inq[v[x][i]]=1;
                Q.push(v[x][i]);
            }
        }
    }
    return (p[d]!=0);
}
int main()
{
    int x,y,z,t,i;
    ifstream fi("fmcm.in");
    ofstream fo("fmcm.out");
    fi>>n>>m>>s>>d;
    for(i=1;i<=m;i++)
    {
        fi>>x>>y>>z>>t;
        v[x].push_back(y);
        v[y].push_back(x);
        Cost[x][y]=t; Cost[y][x]=-t;
        C[x][y]=z;
    }
    while(drum())
    {
        fmin=int(2e9);
        for(i=d;i!=s;i=p[i])
        fmin=min(fmin,C[p[i]][i]-F[p[i]][i]);
        for(i=d;i!=s;i=p[i])
        {
            F[p[i]][i]+=fmin;
            F[i][p[i]]-=fmin;
        }
        cost+=dist[d]*fmin;
    }
    fo<<cost<<"\n";
    return 0;
}