Pagini recente » Cod sursa (job #665731) | Cod sursa (job #110955) | Cod sursa (job #2531246) | Cod sursa (job #1276601) | Cod sursa (job #2695889)
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
using namespace std;
const int NMAX = 1010;
const int INF = 1e9;
int N,M;
int G[NMAX][NMAX], r[NMAX][NMAX],parent[NMAX];
bool viz[NMAX];
vector<int> g[NMAX];
//functie pentru a determina daca exista un drum de la s la d in graful rezidual
bool BFS (int s, int d)
{
for(int i=1;i<=N;i++)
{
viz[i] = false;
}
queue<int> q;
q.push(s);
viz[s] = true;
parent[s] = -1;
while(!q.empty())
{
auto aux = q.front();
q.pop();
for(auto i: g[aux])
{
if(viz[i] == false && r[aux][i] >0)
{
if (i != d){
q.push(i);
}
viz[i] = true;
parent[i] = aux;
}
}
}
return (viz[d] == true);
}
int main() {
ifstream f("maxflow.in");
ofstream out("maxflow.out");
int src, dest, capacitate;
f>>N>>M;
for(int i=0;i<M;i++)
{
f>>src>>dest>>capacitate;
g[src].push_back(dest);
g[dest].push_back(src);
r[src][dest] = capacitate;
}
int max_flow = 0;
while (BFS(1,N))
{
for (auto i : g[N])
{
if (!viz[i] || !r[i][N])
continue;
int aux = INF;
parent[N] = i;
for (int node = N; node != 1; node = parent[node])
aux = min(aux, r[parent[node]][node]);
for (int node = N; node != 1; node = parent[node])
{
r[parent[node]][node] -= aux;
r[node][parent[node]] += aux;
}
max_flow += aux;
}
}
out<<max_flow;
}