Cod sursa(job #2479435)

Utilizator alexdumitrescuDumitrescu George Alex alexdumitrescu Data 23 octombrie 2019 20:25:52
Problema Flux maxim Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.67 kb
#include <bits/stdc++.h>
#define Nmax 1005
using namespace std;
ifstream fin ("maxflow.in");
ofstream fout ("maxflow.out");
int viz[Nmax], f[Nmax][Nmax], c[Nmax][Nmax], l[Nmax], lg, n, m, x, y, i, j, flux;
vector <int> vo[Nmax];
vector <int> vi[Nmax];
void bfs()
{
    int i, u;
    queue <int> q;
    q.push(1); viz[1]=1;
    while(!q.empty()&&!viz[n])
    {
        u=q.front();
        q.pop();
        for(i=0;i<vo[u].size();i++)
            if(!viz[vo[u][i]]&&f[u][vo[u][i]]<c[u][vo[u][i]])
            {
                viz[vo[u][i]]=u;
                q.push(vo[u][i]);
            }
        for(i=0;i<vi[u].size();i++)
            if(!viz[vi[u][i]]&&f[vi[u][i]][u])
            {
                viz[vi[u][i]]=-u;
                q.push(vi[u][i]);
            }
    }
}
int main()
{
    fin >> n >> m;
    for(i=1;i<=m;i++)
    {
        fin >> x >> y;
        fin >> c[x][y];
        vo[x].push_back(y);
        vi[y].push_back(x);
    }
    l[0]=n;
    do
    {
        bfs();
        if(!viz[n])
            break;
        lg=0;
        int a, b; a=b=INT_MAX;
        while(l[lg]!=1)
        {
            l[++lg]=viz[l[lg-1]];
            if(l[lg]>0)
                a=min(a, c[l[lg]][l[lg-1]]-f[l[lg]][l[lg-1]]);
            else
                b=min(b, f[l[lg-1]][-l[lg]]);
        }
        int v=min(a, b);
        for(i=lg;i>=1;i--)
        {
            if(l[i]>0)
                f[l[i]][l[i-1]]+=v;
            else f[l[i-1]][-l[i]]-=v;
        }

        for(i=1;i<=n;i++)
            viz[i]=0;
    }while(1);
    for(i=0;i<vo[1].size();i++)
            flux+=f[1][vo[1][i]];
    fout << flux;
    return 0;
}