Cod sursa(job #2164614)

Utilizator mateiuMateiu Ioan mateiu Data 13 martie 2018 08:47:55
Problema Flux maxim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
struct str{
    int nod,retea;
};
int maxnu(int a,int b)
{
    if(a>b)
    return b;
    return a;
}
vector <str> v[10000];
int mi,viz[10000],tot=0,n;
int minimul[10002];
void dfs(int st)
{
    viz[st]=1;
    for(int i=0;i<v[st].size();i++)
    {
        if(viz[v[st][i].nod]==0 && v[st][i].retea>0)
        {
            minimul[v[st][i].nod]=maxnu(v[st][i].retea,minimul[st]);
            if(v[st][i].nod==n)
            {
                viz[n]=1;
                return;
            }
            dfs(v[st][i].nod);
        }
        if(viz[n]==1)
            return;
    }
}
void cd(int st)
{
    viz[st]=0;
    for(int i=0;i<v[st].size();i++)
    {
        if(viz[v[st][i].nod]==1)
        {
            v[st][i].retea=v[st][i].retea-mi;
            cd(v[st][i].nod);
        }
    }
}
/*void cd1(int st)
{
    viz[st]=0;
    for(int i=0;i<v[st].size();i++)
    {
        if(viz[v[st][i].nod]==1)
        {
            cd1(v[st][i].nod);
        }
    }
}*/
int main()
{
    int x,i,c,y,m;
    f>>n>>m;
    for(i=1;i<=m;i++)
    {
        f>>x>>y>>c;
        if(x!=y)
           v[x].push_back({y,c});
    }
    for(i=1;i<=n;i++)
        minimul[i]=10000;
        mi=0;
    while(mi!=10000)
    {
        mi=10000;
        minimul[1]=10000;
        dfs(1);
        mi=minimul[n];
        cd(1);
    for(i=1;i<=n;i++)
        {
            minimul[i]=10000;
        }
        if(mi!=10000)
        tot=tot+mi;
    }
    g<<tot;
    return 0;
}