Pagini recente » Istoria paginii runda/minus | Cod sursa (job #1750065) | Cod sursa (job #2629094) | Cod sursa (job #1391265) | Cod sursa (job #2696407)
#include <fstream>
#include <iostream>
#include <vector>
#include <queue>
#include <set>
#define max_n 1024
constexpr auto inf = 0x3f3f3f3f;
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int i,j,n,s,t,m;
vector<int> tata;
vector<int> viz;
queue<int> coada;
struct arc
{
int x;
int y;
int cp;
int flx;
};
vector<arc> arce;
vector<int> graph[max_n];
int costs[max_n][max_n];
int flows[max_n][max_n];
int calc_flux_plus(int nod) // flux care iese din nod
{
int flux = 0;
for(i=1;i<=m;i++)
{
if(arce[i].x == nod)
{
flux += arce[i].flx;
}
}
return flux;
}
int calc_flux_minus(int nod) // flux care intra in nod
{
int flux = 0;
for(i=1;i<=m;i++)
{
if(arce[i].y == nod)
{
flux += arce[i].flx;
}
}
return flux;
}
bool construieste_s_t_lant_nesat_BF()
{
for(i=1;i<=n;i++)
{
viz[i] = 0;
}
coada = queue<int>(); // gol
coada.push(s);
viz[s] = 1;
while(!coada.empty())
{
const auto i = coada.front();
coada.pop();
if(i==n)
continue;
for (auto neigh : graph[i])
{
if (costs[i][neigh] == flows[i][neigh] || viz[neigh])
continue;
viz[neigh] = 1;
coada.push(neigh);
tata[neigh] = i;
}
}
return viz[t];
}
int main()
{
fin >> n;
fin >> m;
tata.resize(n+1);
viz.resize(n+1);
for(i=1;i<=m;i++)
{
int x,y,z;
fin >> x>>y>>z;
graph[x].push_back(y);
graph[y].push_back(x);
costs[x][y] += z;
}
s = 1;
t = n;
auto flow = 0;
auto crt_flow = 0;
while(construieste_s_t_lant_nesat_BF())
{
for (auto& node : graph[n])
{
if (flows[node][n] == costs[node][n] || !viz[node])
continue;
tata[n] = node;
crt_flow = inf;
for (auto prev_node = n; prev_node != 1; prev_node = tata[prev_node])
crt_flow = min(crt_flow, costs[tata[prev_node]][prev_node] - flows[tata[prev_node]][prev_node]);
if (crt_flow == 0)
continue;
for (auto prev_node = n; prev_node != 1; prev_node = tata[prev_node])
{
flows[tata[prev_node]][prev_node] += crt_flow;
flows[prev_node][tata[prev_node]] -= crt_flow;
}
flow += crt_flow;
}
}
fout << flow;
}