Cod sursa(job #2129104)

Utilizator Ruxandra985Nanu Ruxandra Laura Ruxandra985 Data 12 februarie 2018 15:30:30
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.76 kb
#include <cstdio>
#include <vector>
#include <iostream>
#define INF 2000000000
using namespace std;
vector <int> v[1001];
int c[1001][1001],fl[1001][1001],f[1001],tt[1001],vf[1001],n,ok,d[1001];
int bfs (int s){
    int i,p,u,nod,vecin;
    for (i=1;i<=n;i++)
        f[i]=0;
    ok=0;
    p=u=1;
    d[p]=s;
    f[s]=1;
    while (p<=u){
        nod=d[p];
        for (i=0;i<v[nod].size();i++){
            vecin=v[nod][i];
            if (f[vecin]==0 && fl[nod][vecin]<c[nod][vecin]){
                f[vecin]=1;
                d[++u]=vecin;
                tt[vecin]=nod;
            }
            if (vecin==n && fl[nod][vecin]<c[nod][vecin])
                vf[++ok]=nod;
        }
        p++;
    }
    return f[n];
}
int main()
{
    FILE *fin=fopen ("maxflow.in","r");
    FILE *fout=fopen ("maxflow.out","w");
    int m,i,x,y,z,nod,vecin,mini,sol=0;
    fscanf (fin,"%d%d",&n,&m);
    for (i=1;i<=m;i++){
        fscanf (fin,"%d%d%d",&x,&y,&z);
        c[x][y]=z;
        v[x].push_back(y);
        v[y].push_back(x);
    }
    while (bfs (1)){
        for (i=1;i<=ok;i++){
            nod=vf[i]; // nod sunt vecinii destinatiei in care am ajuns
            vecin=n;
            mini=INF;
            while (nod!=0){
                mini=min(mini,c[nod][vecin]-fl[nod][vecin]);
                vecin=nod;
                nod=tt[nod];
            }
            nod=vf[i];
            vecin=n;
            while (nod!=0){
                fl[nod][vecin]+=mini;
                fl[vecin][nod]-=mini;
                vecin=nod;
                nod=tt[nod];
            }

        }
    }
    for (i=0;i<v[1].size();i++){
        vecin=v[1][i];
        sol+=fl[1][vecin];
    }
    fprintf (fout,"%d",sol);
    return 0;
}