Cod sursa(job #2523385)

Utilizator alexdumitrescuDumitrescu George Alex alexdumitrescu Data 13 ianuarie 2020 23:23:08
Problema Flux maxim Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.55 kb
#include <bits/stdc++.h>
#define Nmax 10005
using namespace std;
ifstream fin ("maxflow.in");
ofstream fout ("maxflow.out");
int n, m, x, y, c[Nmax][Nmax], f[Nmax][Nmax], flux, viz[Nmax], t[Nmax];
vector <int> v[Nmax];
int bfs()
{
    int u;
    queue <int> q;

    memset(viz, 0, sizeof(viz));
    q.push(1);
    viz[1]=1;
    while(!q.empty())
    {
        u=q.front();
        q.pop();
        for(int i=0;i<v[u].size();i++)
            if(!viz[v[u][i]] && c[u][v[u][i]]!=f[u][v[u][i]])
            {
                viz[v[u][i]]=1;
                t[v[u][i]]=u;
                q.push(v[u][i]);
            }
    }
    if(viz[n]==0)
        return 0;

    for(int i=0;i<v[n].size();i++)
        if(viz[v[n][i]]&&c[v[n][i]][n]!=f[v[n][i]][n])
        {
            int fmin=c[v[n][i]][n]-f[v[n][i]][n];
            vector <int> lant;
            lant.push_back(n);
            u=v[n][i];
            lant.push_back(u);
            while(t[u]!=0)
            {
                fmin=min(fmin, c[t[u]][u]-f[t[u]][u]);
                u=t[u];
                lant.push_back(u);
            }
            flux+=fmin;
            for(int j=0;j<lant.size()-1;j++)
            {
                f[lant[j+1]][lant[j]]+=fmin;
                f[lant[j]][lant[j+1]]-=fmin;
            }
        }
}

int main()
{
    fin >> n >> m;
    for(int i=1;i<=m;i++)
    {
        fin >> x >> y;
        fin >> c[x][y];
        v[x].push_back(y);
        v[y].push_back(x);
    }
    while(bfs());
    fout << flux << '\n';
    return 0;
}