Cod sursa(job #2423417)

Utilizator Maraaa117Mara Alexandra Nedelcu Maraaa117 Data 21 mai 2019 12:51:02
Problema Flux maxim Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.72 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;

}