Cod sursa(job #2908955)

Utilizator puica2018Puica Andrei puica2018 Data 7 iunie 2022 12:12:46
Problema Flux maxim Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("maxflow.in");
ofstream fout("maxflow.out");

int n,m;

int c[1005][1005],f[1005][1005];

int par[1005],vis[1005];

vector <int> g[1005];

bool bfs()
{
    for(int i=1; i<=n; i++)
        vis[i]=par[i]=0;
    queue <int> q;
    q.push(1);
    vis[1]=1;
    while(!q.empty())
    {
        int u=q.front();
        q.pop();
        for(int v:g[u])
        {
            if(vis[v]==0 && f[u][v]<c[u][v])
            {
                par[v]=u;
                vis[v]=1;
                q.push(v);
            }
        }
    }
    return vis[n];
}

int main()
{
    fin>>n>>m;
    for(int i=1; i<=m; i++)
    {
        int x,y,z;
        fin>>x>>y>>z;
        c[x][y]=z;
        g[x].push_back(y);
        g[y].push_back(x);
    }
    int ans=0;
    while(bfs())
    {
        for(auto leaf:g[n])
        {
            if(f[leaf][n]==c[leaf][n] || vis[leaf]==0)
                continue;
            par[n]=leaf;
            int minim=1e6;
            for(int aux=n; aux!=1; aux=par[aux])
                minim=min(minim,c[par[aux]][aux]-f[par[aux]][aux]);
            for(int aux=n; aux!=1; aux=par[aux])
            {
                f[par[aux]][aux]+=minim;
                f[aux][par[aux]]-=minim;
            }
            ans+=minim;
        }
    }
    fout<<ans<<"\n";
    return 0;
}