Pagini recente » Cod sursa (job #929641) | Cod sursa (job #485581) | Cod sursa (job #3185217) | Cod sursa (job #2762133) | Cod sursa (job #2968819)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
// Se Foloseste un BFS pentru a gasi un drum de la nodul start la destinatie care sa treaca prin muchii cu flux diferit de 0
// Se foloseste un vector de noduri vizitate si un vector de parinti pentru a reconstrui drumul
// Dupa fiecare bfs se ia flow-ul minim, se scade din toate muchiile drumului si se adauga la flow-ul maxim
#include <bits/stdc++.h>
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
int capacity[1001][1001],n,m,flow,max_flow;
vector<int> visited,parent;
vector<vector<int>> adj_list;
bool bfs()
{
fill(visited.begin(), visited.end(), 0);
fill(parent.begin(), parent.end(), 0);
visited[1] = 1;
parent[1] = 1;
queue<int> q;
q.push(1);
while(!q.empty())
{
int nod = q.front();
q.pop();
if(nod == n)
return true;
for(int i=0; i<adj_list[nod].size(); i++)
{
if(!visited[adj_list[nod][i]] && capacity[nod][adj_list[nod][i]] > 0)
{
q.push(adj_list[nod][i]);
parent[adj_list[nod][i]] = nod;
visited[adj_list[nod][i]] = 1;
}
}
}
return false;
}
int main()
{
int a,b,c;
f>>n>>m;
visited.resize(n+2, 0);
parent.resize(n+2, 0);
adj_list.resize(n+2, {});
for(int i=1; i<=m; i++)
{
f>>b>>c>>a;
adj_list[b].push_back(c);
adj_list[c].push_back(b);
capacity[b][c] = a;
}
int result = bfs();
while(result)
{
for(int i=0; i<adj_list[n].size(); i++)
{
if(visited[adj_list[n][i]])
{
parent[n] = adj_list[n][i];
flow = INT_MAX;
for(int j=n; j!=1; j=parent[j])
{
flow=min(flow, capacity[parent[j]][j]);
}
if(flow != 0)
{
for(int j=n; j!=1; j=parent[j])
{
capacity[parent[j]][j] -= flow;
capacity[j][parent[j]] += flow;
}
max_flow += flow;
}
}
}
result = bfs();
}
g<<max_flow;
return 0;
}