Cod sursa(job #1483509)

Utilizator Vlad_lsc2008Lungu Vlad Vlad_lsc2008 Data 9 septembrie 2015 15:22:20
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
#include <cstdio>
#include <vector>
#include <queue>
#define NMax 1010
#define inf 200000000
#define pb push_back
#define min(a,b) ((a)<(b)? (a):(b))
using namespace std;

int n,m1;
int prec[NMax], f[NMax][NMax], c[NMax][NMax];
vector<int> m[NMax];
bool viz[NMax];
queue<int> cd;

bool BFS(int p)
{
    int i,poz;
    for(i=1;i<=n;i++) viz[i]=false;
    viz[p]=true;
    cd.push(p);

    while(!cd.empty())
    {
        poz=cd.front(); cd.pop();
        if(poz!=n)
            for(i=0;i<m[poz].size();i++)
            if(!viz[m[poz][i]] && c[poz][m[poz][i]]>f[poz][m[poz][i]])
            {
                prec[m[poz][i]]=poz;
                viz[m[poz][i]]=true;
                cd.push(m[poz][i]);
            }
    }
    return viz[n];
}

int main()
{
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    scanf("%d%d",&n,&m1);
    int i,n1,n2,cost,flow=0,newflow;
    for(;m1;m1--)
    {
        scanf("%d%d%d",&n1,&n2,&cost);
        m[n1].pb(n2);
        m[n2].pb(n1);
        c[n1][n2]+=cost;
    }

    int poz;
    while(BFS(1))
        for(i=0;i<m[n].size();i++)
        {
            prec[n]=m[n][i];
            poz=n;
            newflow=inf;
            while(poz!=1)
            {
                newflow=min(newflow,c[prec[poz]][poz]-f[prec[poz]][poz]);
                poz=prec[poz];
            }
            poz=n;
            while(poz!=1)
            {
                f[poz][prec[poz]]-=newflow;
                f[prec[poz]][poz]+=newflow;
                poz=prec[poz];
            }
             flow+=newflow;
        }
    printf("%d\n",flow);
    fclose(stdin);
    fclose(stdout);
    return 0;
}