Pagini recente » Cod sursa (job #208316) | Cod sursa (job #1146280) | Cod sursa (job #2176419) | Cod sursa (job #1519721) | Cod sursa (job #2753015)
#include <fstream>
#include <vector>
#include <cstring>
#include <climits>
#include <iostream>
using namespace std;
const int NMAX = 1000;
const int MMAX = 5000;
int n;
vector<int> graf[1 + NMAX];
int capacitate[1 + NMAX][1 + NMAX];
int tata[1 + NMAX];
bool lantGasit;
void dfs(int nod)
{
if (nod == n)
{
lantGasit = true;
return;
}
for (auto& vecin : graf[nod])
{
if (tata[vecin] == 0 && capacitate[nod][vecin] > 0)
{
tata[vecin] = nod;
dfs(vecin);
if (lantGasit)
{
return;
}
}
}
}
int main()
{
ifstream in("maxflow.in");
ofstream out("maxflow.out");
int m;
in >> n >> m;
for (int j = 1; j <= m; j++)
{
int x, y, z;
in >> x >> y >> z;
graf[x].emplace_back(y);
graf[y].emplace_back(x);
capacitate[x][y] = z;
}
int maxFlow = 0;
while (true)
{
lantGasit = false;
memset(tata, 0, sizeof(tata));
tata[1] = 1;
dfs(1);
if (!lantGasit)
break;
int capMinima = INT_MAX;
for(int nodCrt = n; tata[nodCrt] != nodCrt; nodCrt = tata[nodCrt])
{
capMinima = min(capMinima, capacitate[tata[nodCrt]][nodCrt]);
}
for(int nodCrt = n; tata[nodCrt] != nodCrt; nodCrt = tata[nodCrt])
{
capacitate[tata[nodCrt]][nodCrt] -= capMinima;
capacitate[nodCrt][tata[nodCrt]] += capMinima;
}
maxFlow += capMinima;
}
out << maxFlow << '\n';
return 0;
}