Cod sursa(job #1418490)

Utilizator ArchazeyBaltatu Andrei-Mircea Archazey Data 13 aprilie 2015 12:03:16
Problema Flux maxim Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include<bits/stdc++.h>
using namespace std;

ifstream fin("maxflow.in");
ofstream fout("maxflow.out");

const int NMAX=1005;

int n,m,sol,ad[NMAX][NMAX],fl[NMAX][NMAX],f[NMAX],st[NMAX];
vector<int>v[NMAX];
vector<int>::iterator it;
bitset<NMAX>viz;

inline bool BFS()
{
    int i,x,len;
    for (i=1;i<=n;i++) viz[i]=f[i]=0;
    len=st[1]=1;
    viz[1]=1;
    for (i=1;i<=len;i++)
        {
            x=st[i];
            for (it=v[x].begin();it!=v[x].end();it++)
                {
                    if (ad[x][*it]==fl[x][*it] || viz[*it]==1) continue;
                    viz[*it]=1;
                    f[*it]=x;
                    st[++len]=*it;
                }
        }
    if (f[n]==0) return 0;
    return 1;
}

int main()
{
    int i,j,x,y,z,mn;
    fin>>n>>m;
    for (i=1;i<=m;i++)
        {
            fin>>x>>y>>z;
            fl[x][y]=z;
            v[x].push_back(y);
            v[y].push_back(x);
        }
    for (sol=0;BFS();)
        for (j=0;j<v[n].size();j++)
        {
            x=v[n][j];
            if (fl[x][n]==ad[x][n] || !viz[x]) continue;
            f[n]=x;

            mn=1<<30;
            for (i=n;i>1;i=f[i])
                mn=min(mn,fl[f[i]][i]-ad[f[i]][i]);
            for (i=n;i>1;i=f[i])
                {
                    ad[f[i]][i]+=mn;
                    ad[i][f[i]]-=mn;
                }
            sol+=mn;
        }
    fout<<sol<<"\n";
    return 0;
}