Cod sursa(job #1504804)

Utilizator badea_adi1999Badea Adrian Catalin badea_adi1999 Data 18 octombrie 2015 12:22:14
Problema Flux maxim de cost minim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.87 kb
#include <cstdio>
#include <bitset>
#include <vector>
#include <bitset>
#include <queue>
#define nmax 355
#define inf 2000000000
using namespace std;
int n,m,source,dest;
int c[nmax][nmax],f[nmax][nmax],p[nmax][nmax];
//Capacitatea unei muchii , fluxul unei muchii , costul unei unitati de flux
int t[nmax],d[nmax],adding;
//Tatal unui nod //Drumul minim pana la un nod
long long cost,l;
vector <int> v[nmax];
bitset <nmax> b;

int bfs()
{
    for (int i=1;i<=n;i++)
        d[i]=inf,t[i]=0;
    d[source]=0;
    int i,j,stop=0;

    while (!stop)
    {
        stop=1;
        for (i=1;i<=n;i++)
            for (j=0;j<v[i].size(); j++)

                if (c[i][v[i][j]]-f[i][v[i][j]]>0 &&d[i]+p[i][v[i][j]]<d[v[i][j]])
                {
                    d[v[i][j]]=d[i]+p[i][v[i][j]];
                    t[v[i][j]]=i;
                    stop=0;
                }
    }
     if (d[dest]<inf/2)
    {
        int adding=inf;

        for (i=dest;i!=source;i=t[i]) adding=min(adding,c[t[i]][i]-f[t[i]][i]);

        for (i=dest;i!=source;i=t[i]) {
            f[t[i]][i] += adding;
            f[i][t[i]] -= adding;
        }

        return adding*d[dest];
    }

    return 0;
}


int main()
{
    freopen("fmcm.in","r",stdin);
    freopen("fmcm.out","w",stdout);
    int i,j,ok=1;
    int x,y,z,k;
    scanf("%d %d %d %d",&n,&m,&source,&dest);
    //Numarul de noduri , numarul de muchii , nodul sursa , nodul destinatie
    for (i=1;i<=m;i++) {
        scanf("%d %d %d %d",&x,&y,&z,&k);
        v[x].push_back(y);//Adaug muchie de la x la y
        v[y].push_back(x);//Adaug muchie de la y la x
        c[x][y]=z;
        p[x][y]=k;
        p[y][x]=-k;
    }
    while (1) {
            l=bfs();
            if (l)
                cost+=l;
            else
                break;
    }
    printf("%d\n",cost);
    return 0;
}