Cod sursa(job #1558869)

Utilizator foxy55Ana Dori foxy55 Data 29 decembrie 2015 18:24:50
Problema Flux maxim Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.08 kb
/*

*/

#include<iostream>
#include<fstream>
#include<vector>
#include <stdio.h>
#include <string.h>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");

int const Nmax=5003;
vector<pair <int,int> >G[Nmax];
int N,M;
int Use[Nmax];
int Min;
int ok=1,actual,flow,nod_initial;
void read()
{
    fin>>N>>M;
    int x,y,c;
    for(int i=1;i<=M;++i)
        {

            fin>>x>>y>>c;

            G[x].push_back(make_pair(y,c));


        }
}
void print()
{

    for(int j=1;j<=N;j++)
    {
        cout<<"liste de adiacenta a lui "<<j<< " :";
        for(int i=0;i<(int)G[j].size();i++)
                cout<<G[j][i].first<<" "<<G[j][i].second<<" ";

        cout<<"\n";


    }
}
int dfs(int nod)
{
    Use[nod]=1;

    if(nod==N)
        ok=1;
    for(int i=0;i<(int)G[nod].size();i++)
    {

        int Vecin=G[nod][i].first;
        if(G[nod][i].second > 0)
        {
            if(!Use[Vecin])
                {
                    if(G[nod][i].second<Min)
                        Min=G[nod][i].second;

                    dfs(Vecin);

                }
            if(nod==nod_initial)
            {

                if(ok==1)  //send flow, daca am ajuns la destinatie
                {
                    //am minimu de pe path
                    for(int i=0;i<(int)G[nod].size();i++)
                        if(Use[G[nod][i].first])
                            G[nod][i].second = G[nod][i].second - Min;
                    flow+=Min;
                       //cout<<endl<<flow<<endl;
                }
                memset(Use,0,sizeof(Use));
                ok=0;
                actual=actual-Min;
                Min=actual;
            }
        }
    }
}
int main()
{
    read();
   // print();

    for(int i=0;i<G[1].size();i++)
                {
                    ok=0;
                    Min=G[1][i].second;
                    actual=Min;
                    nod_initial=G[1][i].first;
                    dfs(G[1][i].first);

                }
    fout<<flow;

return 0;
}