Cod sursa(job #2523405)

Utilizator alexdumitrescuDumitrescu George Alex alexdumitrescu Data 13 ianuarie 2020 23:43:25
Problema Flux maxim Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 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])
        {
            t[n]=v[n][i];
            int fmin=c[t[n]][n]-f[t[n]][n];

            for(u=n; u!=1; u=t[u])
                fmin=min(fmin, c[t[u]][u]-f[t[u]][u]);

            for(u=n; u!=1; u=t[u])
                {
                    f[t[u]][u]+=fmin;
                    f[u][t[u]]-=fmin;
                }
            flux+=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;
    return 0;
}