Cod sursa(job #2419445)

Utilizator Bodo171Bogdan Pop Bodo171 Data 8 mai 2019 16:10:57
Problema Flux maxim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.67 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
const int nmax=1005;
vector<int> v[nmax];
int c[nmax][nmax],fl[nmax][nmax];
int lev[nmax],q[nmax],start[nmax];
int n,m,i,j,x,y,z,flow;
bool bfs()
{
    int u,nod;
    q[u=1]=1;
    lev[1]=1;
    for(i=2;i<=n;i++)
        lev[i]=0;
    for(int p=1;p<=u;p++)
    {
        x=q[p];
        for(int i=0; i<v[x].size(); i++)
        {
            nod=v[x][i];
            if(fl[x][nod]<c[x][nod]&&(!lev[nod]))
            {
                lev[nod]=lev[x]+1;
                q[++u]=nod;
            }
        }
    }
    return (lev[n]!=0);
}
int dfs(int x,int minfl)
{
    int nod=0,nxtfl=minfl;
    if(!minfl) return 0;
    if(x==n)
     return minfl;
    while(start[x]<v[x].size())
    {
        nod=v[x][start[x]];
        if(lev[x]+1==lev[nod]&&fl[x][nod]<c[x][nod])
        {
            nxtfl=min(minfl,c[x][nod]-fl[x][nod]);
            nxtfl=dfs(nod,nxtfl);
            if(nxtfl)
            {
                    fl[x][nod]+=nxtfl;
                    fl[nod][x]-=nxtfl;
                    return nxtfl;
            }
        }
        start[x]++;
    }
    return 0;
}
int main()
{
    ifstream f("flux.in");
    ofstream g("flux.out");
    f>>n>>m;
    for(i=1;i<=m;i++)
    {
        f>>x>>y>>z;
        c[x][y]=z;
        v[x].push_back(y);
        v[y].push_back(x);
    }
    while(bfs())
    {
        for(i=1;i<=n;i++)
            start[i]=0;
        bool ok=1;
        int flux=0;
        while(ok)
        {
            flux=dfs(1,(1<<30));
            ok&=(flux!=0);
            flow+=flux;
        }
    }
    g<<flow;
    return 0;
}