Cod sursa(job #2116559)

Utilizator bori2000Fazakas Borbala bori2000 Data 27 ianuarie 2018 18:54:26
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <iostream>
#include <fstream>
#include <list>
#include <algorithm>
using namespace std;

int cap[1001][1001];
list<int>kov[1001];
int prev[1001];
bool v[1001]={0};
int n, m;


void find_path(int x)
{
    v[x]=true;
    if(x<n)
    {
        for(list<int>::iterator it=kov[x].begin(); it!=kov[x].end(); it++)
        {
            if(cap[x][*it]>0 and !v[*it])
            {
                prev[*it]=x;
                find_path(*it);
            }
        }
    }
    else
    {
        int veg=x;
        int kezd=prev[x];
        int minim=2000000000;
        while(veg!=1)
        {
            if(cap[kezd][veg]<minim) minim=cap[kezd][veg];
            kezd=prev[kezd];
            veg=prev[veg];
        }

        veg=x;
        kezd=prev[x];

        while(veg!=1)
        {
            cap[kezd][veg]-=minim;
            cap[veg][kezd]+=minim;
            kezd=prev[kezd];
            veg=prev[veg];
        }
    }
    v[x]=false;
}

int main()
{
    ifstream f("maxflow.in");
    ofstream g("maxflow.out");
    f>>n>>m;
    int x, y, z;
    for(int i=1; i<=m; i++)
    {
        f>>x>>y>>z;
        cap[x][y]=z;
        kov[x].push_back(y);
        kov[y].push_back(x);
    }

    find_path(1);

    int ered=0;
    for(list<int>::iterator it=kov[n].begin(); it!=kov[n].end(); it++) ered+=cap[n][*it];
    g<<ered<<endl;

    return 0;
}