Cod sursa(job #899647)

Utilizator paulbotabota paul paulbota Data 28 februarie 2013 15:32:22
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.9 kb
#include <cstdio>
#include <queue>
#define min(a,b) ( (a < b) ? a : b)
#define MAXN 1010
#define inf 1<<30

using namespace std;

struct graf
{
    int nod;
    graf *next;
};

graf *a[MAXN];

int c[MAXN][MAXN],f[MAXN][MAXN],viz[MAXN],tata[MAXN],flux,n,m;

void add(int x,int y)
{
    graf *q=new graf;
    q->nod=y;
    q->next=a[x];
    a[x]=q;
}

void read()
{
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    scanf("%d %d",&n,&m);
    int i;
    for(i=1;i<=m;i++)
    {
        int x,y,z;
        scanf("%d %d %d",&x,&y,&z);
        c[x][y]=+z;
        add(x,y);
        add(y,x);
    }
}

inline int bfs()
{
    queue<int> coada;
    memset(viz,0,sizeof(viz));
    coada.push(1);
    viz[1]=1;
    while(!coada.empty())
    {
        int nod=coada.front();
        coada.pop();
        if(nod==n) continue;
        graf *q=a[nod];
        for(;q;q=q->next)
        {
            int vertex=q->nod;
            if(c[nod][vertex]==f[nod][vertex] || viz[vertex]) continue;
            viz[vertex]=1;
            coada.push(vertex);
            tata[vertex]=nod;
        }
    }
    return viz[n];
}

void flow()
{
    int flux_minim=0;
    while(bfs())
    {
        graf *q=a[n];
        for(;q;q=q->next)
        {
            int nod=q->nod;
            if(c[nod][n]==f[nod][n] || !viz[nod]) continue;
            tata[n]=nod;
            flux_minim=inf;
            for(nod=n;nod!=1;nod=tata[nod])
                flux_minim=min(flux_minim,c[tata[nod]][nod]-f[tata[nod]][nod]);
            if(flux_minim==0) continue;
            for(nod=n;nod!=1;nod=tata[nod])
            {
                f[tata[nod]][nod]+=flux_minim;
                f[nod][tata[nod]]-=flux_minim;
            }
             flux+=flux_minim;
        }
    }
    printf("%d\n",flux);
}

int main()
{
    read();
    flow();
    return 0;
}