Cod sursa(job #3040500)

Utilizator OrzaSERBANSerban Orza OrzaSERBAN Data 29 martie 2023 22:23:40
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.59 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");

int n,m;
struct muchie
{
    int x,y,cap;
};
vector<muchie> edges;
vector<int> v[1001];
int t[1001];
int used[1001];
queue<int>q;

int bfs(int start,int endd)
{
    int i,j,k,z,u;
    for(i=1;i<=n;i++)
    {
        t[i]=-1;
        used[i]=0;
    }
    q.push(start);
    used[start]=1;
    while(q.empty()==0)
    {
        k=q.front();
        z=v[k].size();
        for(i=0;i<z;i++)
        {
            u=v[k][i];
            j=edges[u].y;
            if(used[j]==0 and edges[u].cap>0)
            {
                used[j]=1;
                t[j]=u;
                q.push(j);
            }
        }
        q.pop();
    }
    if(t[endd]==-1)
        return 0;
    return 1;
}
int main()
{
    int i,j,x,y,cap,a,b;
    f>>n>>m;
    for(i=1;i<=m;i++)
    {
        f>>x>>y>>cap;
        edges.push_back({x,y,cap});
        v[x].push_back(edges.size()-1);
        //si cea inversa
        edges.push_back({y,x,0});
        v[y].push_back(edges.size()-1);
    }
    a=1;b=n;//nodul de intrare si nodul de iesire
    int flux=0,minim;
    while(bfs(a,b)==1)
    {
        minim=100000001;
        x=b;
        while(t[x]!=-1)
        {
            minim=min(minim,edges[t[x]].cap);
            x=edges[t[x]].x;
        }
        x=b;
        while(t[x]!=-1)
        {
            edges[t[x]].cap-=minim;
            edges[t[x]^1].cap+=minim;
            x=edges[t[x]].x;
        }
        flux=flux+minim;
    }
    g<<flux;
    return 0;
}