Cod sursa(job #1418855)

Utilizator ArchazeyBaltatu Andrei-Mircea Archazey Data 14 aprilie 2015 11:24:41
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include<bits/stdc++.h>
using namespace std;

ifstream fin("fmcm.in");
ofstream fout("fmcm.out");

const int oo=1<<30;
const int NMAX=355;

int n,m,S,D,fl[NMAX][NMAX],ad[NMAX][NMAX],c[NMAX][NMAX];
int f[NMAX],dp[NMAX];
vector<int>v[NMAX];
vector<int>::iterator it;
int Q[1000005];
bitset<NMAX>viz;

inline bool DIJKSTRA()
{
    int i,len;
    for (i=1;i<=n;i++) f[i]=dp[i]=oo;
    dp[S]=0;viz[S]=1;
    len=1;Q[len]=S;
    for (i=1;i<=len;i++)
        {
            for (it=v[Q[i]].begin();it!=v[Q[i]].end();it++)
                if (fl[Q[i]][*it]>ad[Q[i]][*it] && dp[*it]>(dp[Q[i]]+c[Q[i]][*it]))
                    {
                        dp[*it]=dp[Q[i]]+c[Q[i]][*it];
                        f[*it]=Q[i];
                        if (!viz[*it])
                            {
                                viz[*it]=1;
                                Q[++len]=*it;
                            }
                    }
            viz[Q[i]]=0;
        }
    if (f[D]==oo) return 0;
    return 1;
}

int main()
{
    int i,x,y,w,z,sol,mn;
    fin>>n>>m>>S>>D;
    for (i=1;i<=m;i++)
        {
            fin>>x>>y>>w>>z;
            fl[x][y]+=w;
            c[x][y]=z;c[y][x]=-z;
            v[x].push_back(y);
            v[y].push_back(x);
        }
    for (sol=0;DIJKSTRA();)
        {
            mn=oo;
            for (i=D;i!=S;i=f[i])
                mn=min(mn,fl[f[i]][i]-ad[f[i]][i]);
            for (i=D;i!=S;i=f[i])
                {
                    ad[f[i]][i]+=mn;
                    ad[i][f[i]]-=mn;
                }
            sol+=mn*dp[D];
        }
    fout<<sol<<"\n";
    return 0;
}