Cod sursa(job #1891742)

Utilizator geo_furduifurdui geo geo_furdui Data 24 februarie 2017 11:53:28
Problema Flux maxim Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <fstream>
#include<climits>
using namespace std;
ifstream cin ("maxflow.in");
ofstream cout ("maxflow.out");
int n,k,m,start[5010],tata[1010],coada[1010],cost[1010][1010],viz[1010],nr,minim[1010],flux;
struct bla
{
    int nod,urm;
} t[1010];
void read ()
{ int a,b,c;
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        cin>>a>>b>>c;
        t[++k].nod=b; t[k].urm=start[a]; start[a]=k; cost[a][b]=c;
    }
}
bool bfs ()
{
    int ps=1,pi=1;
    coada[1]=1; tata[1]=-1; minim[1]=INT_MAX;
    while(ps<=pi)
    {
        int x=start[coada[ps]];
        while(x)
        {
            if(viz[t[x].nod]<nr && cost[coada[ps]][t[x].nod]!=0)
                {coada[++pi]=t[x].nod,tata[t[x].nod]=coada[ps],viz[t[x].nod]=nr; minim[t[x].nod]=min(minim[coada[ps]],cost[coada[ps]][t[x].nod]);
                if(t[x].nod==n) return true;}
            x=t[x].urm;
        } ++ps;
    }
    return false;
}
void solve_here ()
{ nr=1;
    while(bfs())
    {
        int x=n;
        while(tata[x]!=-1)
        {
            cost[tata[x]][x]-=minim[n];
            x=tata[x];
        }
        flux+=minim[n]; ++nr;
    }
}
void write ()
{
    cout<<flux;
}
int main()
{
    read();
    solve_here();
    write();
    cin.close();
    cout.close();
    return 0;
}