Cod sursa(job #2695147)

Utilizator vladdudauDudau Vlad vladdudau Data 11 ianuarie 2021 22:23:31
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include <bits/stdc++.h>
#define Nmax 10005
#define pb push_back
using namespace std;
ifstream fin ("maxflow.in");
ofstream fout ("maxflow.out");
int n, m, x, y, C, c[Nmax][Nmax], f[Nmax][Nmax], flux, viz[Nmax], t[Nmax];
vector <int> v[Nmax];
int bfs()
{
    memset(viz, 0, sizeof(viz));

    viz[1]=1;

    queue <int> q;
    int u;
    viz[1]=1;
    q.push(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;
                if(v[u][i]!=n)
                {
                    t[v[u][i]]=u;
                    q.push(v[u][i]);
                }
            }
    }

    if(!viz[n])
        return 0;

    for(int i=0;i<v[n].size();i++)
    {
        t[n]=v[n][i];
        if(viz[t[n]] && c[t[n]][n]!=f[t[n]][n])
        {
            int fmin=INT_MAX;
            for(u=n;u!=1;u=t[u])
                fmin=min(fmin, c[t[u]][u]-f[t[u]][u]);

            flux+=fmin;

            for(u=n;u!=1;u=t[u])
            {
                f[t[u]][u]+=fmin;
                f[u][t[u]]-=fmin;
            }
        }
    }

    return 1;
}

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