Cod sursa(job #921043)

Utilizator andrettiAndretti Naiden andretti Data 20 martie 2013 18:56:10
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include<stdio.h>
#include<queue>
#include<vector>
#define pb push_back
#define mp make_pair
#define maxn 1005
using namespace std;

int n,m,nr=1,flow;
int c[maxn][maxn],f[maxn][maxn];
int v[maxn],t[maxn];
vector <int> l[maxn];

void cit()
{
    int i;
    int x,y,ct;

    scanf("%d%d",&n,&m);
    for(i=1;i<=m;i++)
    {
        scanf("%d%d%d",&x,&y,&ct);
        l[x].pb(y);
        l[y].pb(x);
        c[x][y]=ct;
    }

}

int bfs()
{
    int k;
    queue <int> q;

    q.push(1); v[1]=nr;
    while(!q.empty())
    {
        k=q.front();
        if(k==n) {q.pop(); continue;}

        for(unsigned int i=0;i<l[k].size();i++)
           if(v[l[k][i]]!=nr && f[k][l[k][i]]<c[k][l[k][i]])
           {
               q.push(l[k][i]);
               v[l[k][i]]=nr;
               t[l[k][i]]=k;
           }
        q.pop();
    }
    return v[n];
}

void ed_k()
{
    int j;
    int minn;

    while(bfs()==nr)
    {
        for(unsigned int i=0;i<l[n].size();i++)
           if(v[l[n][i]]==nr && f[l[n][i]][n]<c[l[n][i]][n])
           {
               t[n]=l[n][i];

               minn=999999999;
               for(j=n;t[j]!=0;j=t[j])
                 if(minn>c[t[j]][j]-f[t[j]][j])
                    minn=c[t[j]][j]-f[t[j]][j];

                for(j=n;t[j]!=0;j=t[j])
                {
                    f[t[j]][j]+=minn;
                    f[j][t[j]]-=minn;
                }
              flow+=minn;
           }
        nr++;
    }
}

int main()
{
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);

    cit();
    ed_k();
    printf("%d",flow);

    fclose(stdin);
    fclose(stdout);
    return 0;
}