Cod sursa(job #431639)

Utilizator mircea_infoSuciu Mircea-Gabriel mircea_info Data 1 aprilie 2010 11:25:36
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.72 kb
#include <cstdio>
#include <vector>
#define maxn 1001

using namespace std;

int n,m,sum,min;
int used[maxn],tata[maxn],st[maxn];
int a[maxn][maxn];
vector <int> g[maxn];
int flux,poz;

int minim(int x, int y)
{
    return x<y?x:y;
}

int bf()
{
    for(int i=1;i<=n;i++)
        tata[i]=0;
    tata[1]=0;
    st[0]=1;
    st[1]=1;
    for(int i=1;i<=st[0];i++)
        for(int j=0;j<g[st[i]].size();j++)
        {
            if(tata[g[st[i]][j]] || !a[st[i]][g[st[i]][j]])
                continue;
            tata[g[st[i]][j]]=st[i];
            st[++st[0]]=g[st[i]][j];
            if(g[st[i]][j]==n)
                return 1;
        }
    return 0;
}

void rezolva()
{
    while(bf())
    {
        for(int i=1;i<=n;i++)
        {
            if(!tata[i] || !a[i][n])
                continue;
            flux=a[i][n];
            poz=i;
            while (poz!=1)
            {
                flux=minim(flux,a[tata[poz]][poz]);
                poz=tata[poz];
            }
            if(!flux)
                continue;
            a[n][i]+=flux;
            a[i][n]-=flux;
            poz=i;
            while(poz!=1)
            {
                a[tata[poz]][poz]-=flux;
                a[poz][tata[poz]]+=flux;
                poz=tata[poz];
            }
            sum+=flux;
        }
    }
    printf("%d\n",sum);
}

int main()
{
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    scanf("%d%d",&n,&m);
    int x,y,z;
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&x,&y,&z);
        a[x][y]=z;
        g[x].push_back(y);
        g[y].push_back(x);
    }
    used[1]=1;
    rezolva();
    fclose(stdout);
    return 0;
}