Cod sursa(job #2444309)

Utilizator Ruxandra985Nanu Ruxandra Laura Ruxandra985 Data 31 iulie 2019 09:02:43
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.86 kb
#include <cstdio>
#include <deque>
#include <vector>
#include <cstring>
#include <algorithm>
#define DIMN 1010
#define INF 2000000000
using namespace std;

deque <int> dq;
vector <pair <int,int> > v[DIMN];
int dist[DIMN],cap[DIMN][DIMN],n,start[DIMN];

int bfs (){
    int nod,i,vecin;
    dq.push_back(1);
    memset (dist , 0 , sizeof(dist));
    dist[1] = 1;
    while (!dq.empty()){
        nod = dq.front();
        dq.pop_front();
        for ( i=0 ; i<v[nod].size() ; i++ ){
            vecin = v[nod][i].first;
            if (!dist[vecin] && cap[nod][vecin]){
                dist[vecin] = dist[nod] + 1;
                dq.push_back(vecin);
            }
        }
    }
    if (dist[n] == 0)
        return 0;
    return 1;
}

int dfs (int nod , int flow){
    int vecin,sol;
    if (nod == n || !flow)
        return flow;

    for (;start[nod] < v[nod].size() ; start[nod]++){
        vecin = v[nod][start[nod]].first;
        if (dist[nod] + 1 == dist[vecin] && cap[nod][vecin]>=0){
            sol = dfs (vecin , min(flow , cap[nod][vecin]));
            if (sol > 0){
                cap[nod][vecin]-=sol;
                cap[vecin][nod]+=sol;
                return sol;
            }
        }
    }
    return 0;
}

int main()
{
    FILE *fin = fopen ("maxflow.in","r");
    FILE *fout = fopen ("maxflow.out","w");
    int m,x,y,z,mflow,flow,i;
    fscanf (fin,"%d%d",&n,&m);
    for (i=1;i<=m;i++){
        fscanf (fin,"%d%d%d",&x,&y,&z);
        cap[x][y] = z;
        v[x].push_back(make_pair(y,z));
        v[y].push_back(make_pair(x,0));
    }
    mflow = 0;
    while (bfs()){

        memset (start , 0, sizeof(start));

        flow = dfs (1,INF);

        while (flow > 0){
            mflow += flow;
            flow = dfs(1,INF);
        }

    }
    fprintf (fout,"%d",mflow);
    return 0;
}