Cod sursa(job #1864043)

Utilizator sotoc1999Sotoc George sotoc1999 Data 31 ianuarie 2017 14:07:12
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.97 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
int n,m;
struct graf
{
    int vecin;
    int cost;
    struct graf *urm;
}*l[1004],*actual;
bool viz[1001];
int c[1001][1001];//matricea costurilor
int p[1001]; // parinti
int coada[1001];
int flow;
int minim(int a,int b)
{
    if(a<b)
        return a;
    return b;
}
void actualizare(int st,int dr)
{
    int mini=2000000000;
    int aux=dr;
    while(aux>st)
    {
        mini=minim(mini,c[p[aux]][aux]);
        aux=p[aux];
    }
    flow+=mini;
    aux=dr;
    while(aux>st)
    {
        c[p[aux]][aux]-=mini;
        c[aux][p[aux]]+=mini;
        aux=p[aux];
    }
}
int bfs(int st,int dr)
{
    for(int i=1;i<=n;i++)
        viz[i]=0;
    int inc,sf;
    inc=sf=1;
    int nod=1;
    coada[inc]=st;
    bool ok=0;
    while(inc<=sf)
    {
        nod=coada[inc];
        inc++;
        for(graf *actual=l[nod];actual!=NULL;actual=actual->urm)
        {
            if(viz[actual->vecin]==0&&c[nod][actual->vecin]>0)
            {
                p[actual->vecin]=nod;
                if(actual->vecin==dr){
                    actualizare(st,dr);
                    ok=1;
                }
                else{
                    sf++;
                    coada[sf]=actual->vecin;
                    viz[actual->vecin]=1;
                }
            }
        }
    }
    if(ok==1)
        return 1;
    else
        return 0;
}
int main()
{
    f>>n>>m;
    int i,x,y,costuri;
    for(i=1;i<=m;i++)
    {
        f>>x>>y>>costuri;
        c[x][y]=costuri;
        actual=new graf;
        actual->cost=costuri;
        actual->vecin=y;
        actual->urm=l[x];
        l[x]=actual;

        actual=new graf;
        actual->cost=costuri;
        actual->vecin=x;
        actual->urm=l[y];
        l[y]=actual;
    }
    while(bfs(1,n))
    {

    }
    g<<flow;
    return 0;
}