Cod sursa(job #2421744)

Utilizator teodor.dumitrescuDumitrescu Teodor teodor.dumitrescu Data 15 mai 2019 22:12:06
Problema Flux maxim Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

int flux[10005],pred[1005][2],viz[1005],cap[10005];
vector <pair<int,int> > graf[1005];
int D,f;
int DFS(int node)
{
    int lim,i,vecin,muchie,val;
    viz[node]=1;
    lim=graf[node].size();
    for(i=0;i<lim;i++)
    {
        vecin=graf[node][i].first;
        muchie=graf[node][i].second;
        if(viz[vecin]==0 && flux[muchie]<cap[muchie])
        {
            val=DFS(vecin);
            if(val)
            {
                pred[vecin][0]=node;
                pred[vecin][1]=muchie;
                if(val<cap[muchie]-flux[muchie])
                    return val;
                else
                    return cap[muchie]-flux[muchie];
            }
        }
    }
    if(node!=D)
        return 0;
    else
        return f;

}

int main()
{
    ifstream in("maxflow.in");
    ofstream out("maxflow.out");
    int N,M,i,j,x,y,c,S,val,node,muchie,Flux=0;
    in>>N>>M;
    S=1;
    D=N;
    for(i=1;i<=M;i++)
    {
        in>>x>>y>>c;
        if(y==D)
            f+=c;
        cap[i]=c;
        cap[i+M]=0;
        graf[x].push_back(make_pair(y,i));
        if(y!=S)
            graf[y].push_back(make_pair(x,M+i));
    }
    while(val=DFS(S))
    {
        node=D;
        while(node!=S)
        {
            muchie=pred[node][1];
            flux[muchie]+=val;
            flux[muchie+M]-=val;
            node=pred[node][0];
        }
        Flux+=val;
        for(i=1;i<=N;i++)
            viz[i]=0;
    }
    out<<Flux;
    return 0;
}