Pagini recente » Cod sursa (job #1524984) | Cod sursa (job #1248231) | Cod sursa (job #2480739) | Cod sursa (job #651747) | Cod sursa (job #2695925)
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
#define nmax 1005
#define inf 1e9
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
bool viz[nmax];
int n ,m;
int G[nmax][nmax], r[nmax][nmax], parent[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;
}
viz[s] = true;
parent[s] = -1;
queue<int> q;
q.push(s);
while(!q.empty()){
auto now = q.front();
q.pop();
for(auto next: g[now]){
if(viz[next] == false && r[now][next] >0){
if (next != d){
q.push(next);
}
viz[next] = true;
parent[next] = now;
}
}
}
return (viz[d] == true);
}
int main() {
int src, dest, capacitate, max_flow, j;
fin>>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;
}
while (bfs(1, n))
{
for (auto i : g[n])
{
if (!viz[i] || !r[i][n])
continue;
int aux = inf;
parent[n] = i;
for (j = n; j != 1; j = parent[j])
aux = min(aux, r[parent[j]][j]);
for (j = n; j != 1; j = parent[j])
{
r[parent[j]][j] -= aux;
r[j][parent[j]] += aux;
}
max_flow += aux;
}
}
fout<<max_flow;