Cod sursa(job #2700467)

Utilizator Horis21Horia Radu Horis21 Data 27 ianuarie 2021 19:29:15
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <fstream>
#include <vector>
#include <queue>
#define V 1000

using namespace std;


vector<int> graph[V];
queue<int> q;
int parent[V];
int cap[V][V];

int s,t,n,m,x,y,z;

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

void reset()
{
    for(int i=0;i<n;i++)
    {
        parent[i]=-1;
    }
}

int bfs()
{
    q.push(s);
    while(!q.empty())
    {
        int u = q.front();
        q.pop();
        for(auto v : graph[u])
        {
            if(parent[v]==-1 && cap[u][v]>0)
            {
                parent[v]=u;
                q.push(v);
            }
        }
    }
    return parent[t];
}

void ek()
{
    reset();
    int flow=0;
    while(bfs()!=-1)
    {
        for(auto v : graph[t])
        {
            int mincap = cap [v][t];
            for (int i = v; i != 0; i = parent[i]) mincap = min(mincap, cap[parent[i]][i]);
			for (int i = v; i != 0; i = parent[i])
			{
				cap[parent[i]][i] -= mincap;
				cap[i][parent[i]] += mincap;
			}
			flow += mincap;
			cap[v][t] -= mincap;
			cap[t][v] += mincap;
        }
        reset();
    }
    out << flow;
}

int main()
{
    in >> n >> m;
    s=0;
    t=n-1;
    for(int i=0;i<m;i++)
    {
        in >> x >> y >> z;
        x--;
        y--;
        cap[x][y] = z;
		graph[x].push_back(y);
		graph[y].push_back(x);
    }
    ek();
    return 0;
}