Cod sursa(job #425626)

Utilizator ZillaMathe Bogdan Zilla Data 25 martie 2010 21:49:41
Problema Flux maxim de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.05 kb
#include <algorithm>
#include <vector>
#include <bitset>
#include <queue>

using namespace std;

#define pb push_back
#define mp make_pair
#define sc second
#define fs first
#define INF 0x3f3f
#define Nmax 355

vector<pair <short,short> > g[Nmax];
short c[Nmax][Nmax],f[Nmax][Nmax],dist[Nmax],t[Nmax];
bitset <Nmax> viz;
short n,m,s,d;
int cost;

struct cmp
{
    bool operator () (const short &a , const short &b) const
    {
        return dist[a]>dist[b];
    }
}; priority_queue <short,vector<short>,cmp> q;

bool dijkstra()
{
    vector <pair <short,short> > :: iterator it;
    short nod;

    memset(dist,INF,sizeof(dist));
    dist[s]=0;

    for(q.push(s) ; !q.empty();)
        {
            nod = q.top();
            viz[nod] = 0;
            q.pop();
            for(it=g[nod].begin() ; it!=g[nod].end ();++it)
                if(dist[it->fs]>dist[nod]+it->sc && c[nod][it->fs]>f[nod][it->fs])
                    {
                        dist[it->fs]=dist[nod]+it->sc;
                        t[it->fs]=nod;
                        if(!viz[it->fs])
                            {
                                q.push(it->fs);
                                viz[it->fs]=1;
                            }
                    }
        }
    if(dist[d]==INF)
        return 0;
    return 1;
}

int main()
{
    short i,x,y,z,w;

    freopen("fmcm.in","r",stdin);
    freopen("fmcm.out","w",stdout);

    scanf("%hd%hd%hd%hd",&n,&m,&s,&d);
    for(i=1;i<=m;++i)
        {
            scanf("%hd%hd%hd%hd",&x,&y,&z,&w);
            c[x][y]=z;
            g[x].pb (mp(y,w));
            g[y].pb (mp(x,-w));
        }

    int nrmin;

    for(nrmin=INF;dijkstra();nrmin=INF)
        {
            for(i=d;i!=s;i=t[i])
                nrmin=min(nrmin,c[t[i]][i]-f[t[i]][i]);
            for(i=d;i!=s;i=t[i])
                {
                    f[t[i]][i]+=nrmin;
                    f[i][t[i]]-=nrmin;
                }
            cost+=nrmin*dist[d];
        }
    printf("%d",cost);
    return 0;
}