Cod sursa(job #3261890)

Utilizator xDemonstyMatei Haba Ionut xDemonsty Data 7 decembrie 2024 15:43:04
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.97 kb
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream cin("maxflow.in");
ofstream cout("maxflow.out");
const int N=1001;
vector<int>adj[N];
int n,m,capacitate[N][N];
bool viz[1001];
void citeste()
{
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        int a,b,flux;
        cin>>a>>b>>flux;
        if(capacitate[a][b]==0)
        {
            adj[a].push_back(b);
            adj[b].push_back(a);
        }
        capacitate[a][b]+=flux;
    }
}
int parent[N];
void init()
{
    for(int i=1;i<=n;i++)
        {parent[i]=0;
        viz[i]=false;}
    parent[1]=-1;
    viz[1]=true;
}
bool bfs()
{
    queue<int>q;
    init();
    q.push(1);
    while(!q.empty())
    {
        int nod=q.front();
        viz[nod]=true;
        q.pop();
        for(auto u:adj[nod])
        {
            if(viz[u]==false && parent[u]==0&&capacitate[nod][u])
            {
                parent[u]=nod;
                if(u!=n)
                    q.push(u);
            }
        }
    }
    return bool(parent[n]!=0);
}
void find_flow()
{
    int max_flow=0;
    while(bfs())
    {
        for(auto u:adj[n])
        {
            int fmin=1e9;
            int act=u;
            if(viz[u]==false)
                continue;
            if(capacitate[u][n]==0)
                continue;
            fmin=min(fmin,capacitate[u][n]);
            while(act!=1)
            {
                fmin=min(fmin,capacitate[parent[act]][act]);
                act=parent[act];
            }
            if(fmin==0)
                continue;
            act=u;
            capacitate[u][n]-=fmin;
            while(act!=1)
            {
                capacitate[parent[act]][act]-=fmin;
                capacitate[act][parent[act]]+=fmin;
                act=parent[act];
            }
            max_flow+=fmin;
        }
    }
    cout<<max_flow;
}
int main()
{
    citeste();
    find_flow();
    return 0;
}