Cod sursa(job #953418)

Utilizator misinozzz zzz misino Data 26 mai 2013 00:47:07
Problema Flux maxim de cost minim Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 kb
#include<fstream>
#include<vector>
#include<cstring>
#include<queue>
#define pb push_back
#define mp make_pair
#define co first
#define no second
#define INF 999999999
using namespace std;
ifstream f("fmcm.in");
ofstream g("fmcm.out");
int i,n,costt,m,s,dest,x,y,z,tt,fluxm;
bool viz[355];
int cost[355][355],c[355][355];
int fl[355][355],t[355],d[355];
vector<int>l[355];
queue<int>q;
inline int bellman_ford()
{
    memset(viz,0,sizeof(viz));
    memset(t,0,sizeof(t));
    memset(d,INF,sizeof(d));
    q.push(s);
    viz[s]=1;
    d[s]=0;
    while(!q.empty())
    {
        x=q.front();
        q.pop();
        viz[x]=0;
        if(x==dest)
        continue;
        for(int i=0,dim=l[x].size();i<dim;++i)
        {
            y=l[x][i];
            if(c[x][y]>fl[x][y]&&d[y]>d[x]+cost[x][y])
            {
                d[y]=d[x]+cost[x][y];
                t[y]=x;
                if(!viz[y])
                {
                    q.push(y);
                    viz[y]=1;
                }
            }
        }
    }
    return !t[dest];
}
int main()
{
    f>>n>>m>>s>>dest;
    for(i=1;i<=m;++i)
    {
        f>>x>>y>>z>>tt;
        l[x].pb(y);
        l[y].pb(x);
        c[x][y]=z;
        cost[x][y]=tt;
        cost[y][x]=-tt;
    }
    while(1)
    {
        if(bellman_ford())
        break;
        fluxm=INF;
        x=dest;
        while(x!=s)
        {
            fluxm=min(fluxm,c[t[x]][x]-fl[t[x]][x]);
            x=t[x];
        }
        if(!fluxm)
        continue;
        x=dest;
        while(x!=s)
        {
            fl[t[x]][x]+=fluxm;
            fl[x][t[x]]-=fluxm;
            x=t[x];
        }
        costt+=fluxm*d[dest];
    }
    g<<costt<<'\n';
    return 0;
}