Cod sursa(job #1504813)

Utilizator badea_adi1999Badea Adrian Catalin badea_adi1999 Data 18 octombrie 2015 12:49:45
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.98 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;
queue <int> q;



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

    q.push(source);
    while (!q.empty()) {

        i=q.front();
        b[i]=0;
        q.pop();

        for (r=0;r<v[i].size();r++) {
            j=v[i][r];
            if (c[i][j]-f[i][j]>0&&d[i]+p[i][j]<d[j]) {
                    d[j]=d[i]+p[i][j];
                    t[j]=i;
                    if (b[j]==0) {
                        b[j]=1;
                        q.push(j);
                    }
            }
        }
    }
     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;
}