Cod sursa(job #2189730)

Utilizator pepsiM4A1Ozturk Arif pepsiM4A1 Data 28 martie 2018 21:27:27
Problema Flux maxim de cost minim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2.61 kb
#include <cstdio>
#include <vector>
#include <cstdlib>
#include <queue>
#include <algorithm>
#define pb push_back
#define mp make_pair
using namespace std;
const int nmax=355,INF=100000000,DIM=50000;
char buff[DIM];
int poz=DIM-1;
void citeste(int &nr)
{
    nr=0;
    int semn=0;
    while(!('0'<=buff[poz]&&buff[poz]<='9'))
    {
        if(buff[poz]=='-') semn=1;
        if(++poz==DIM) fread(buff,1,DIM,stdin),poz=0;
    }
    while(('0'<=buff[poz]&&buff[poz]<='9'))
    {
        nr=nr*10 + buff[poz]-'0';
        if(buff[poz]=='-') semn=1;
        if(++poz==DIM) fread(buff,1,DIM,stdin),poz=0;
    }
    if(semn) nr=-nr;
}
int f[nmax][nmax],c[nmax][nmax],d[nmax][nmax],t[nmax],dist[nmax],vis[nmax],upd[nmax];
queue<int>q;
vector<int>adj[nmax];
int n,m,s,dest;
inline void citire()
{
    citeste(n),citeste(m),citeste(s),citeste(dest);
   // printf("%d %d %d %d\n",n,m,s,dest);
    for(;m>0;--m)
    {
        int x,y,ct,z;
        citeste(x),citeste(y),citeste(ct),citeste(z);
    //    printf("%d %d %d %d\n",x,y,ct,z);
        adj[x].pb(y);
        adj[y].pb(x);
        c[x][y]+=ct;
        d[x][y]+=z;
        d[y][x]-=z;
    }
    for(int i=1;i<=n;i++) random_shuffle(adj[i].begin(),adj[i].end());
}
int bellman()
{
    for(int i=1;i<=n;i++)
    {
        dist[i]=INF;
        upd[i]=0;
        vis[i]=0;
        t[i]=0;
    }
    q.push(s);
    vis[s]=1;
    dist[s]=0;
    while(!q.empty())
    {
        int nod=q.front();
        q.pop();
        vis[nod]=0;
        for(vector<int>::iterator it=adj[nod].begin();it!=adj[nod].end();++it)
        {
            if(c[nod][*it]-f[nod][*it]<=0) continue;
            if(dist[*it]>dist[nod]+d[nod][*it])
            {
                dist[*it]=dist[nod]+d[nod][*it];
                t[*it]=nod;
                if(!vis[*it])
                {
                    vis[*it]=1;
                    q.push(*it);
                }
            }
        }
    }
    if(dist[dest]==INF) return 0;
    return 1;
}
inline void do_flow()
{
    int flow=0,cost=0;
    for(int fmin=INF;bellman();)
    {
        int sumt=0;
        for(int nod=dest;nod!=s;nod=t[nod])
        {
            sumt+=d[t[nod]][nod];
            fmin=min(fmin,c[t[nod]][nod]-f[t[nod]][nod]);
        }
        cost+=dist[dest]*fmin;
        flow+=fmin;
        for(int nod=dest;nod!=s;nod=t[nod])
        {
            f[t[nod]][nod]+=fmin;
            f[nod][t[nod]]-=fmin;
        }
    }
    printf("%d\n",cost);
}
int main()
{
    freopen ("fmcm.in","r",stdin);
    freopen ("fmcm.out","w",stdout);
    citire();
    do_flow();
}