Pagini recente » Cod sursa (job #2911088) | Cod sursa (job #2359981) | Cod sursa (job #2309275) | Cod sursa (job #600057) | Cod sursa (job #2753662)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define INT_MAX 2147483646
using namespace std;
int flux_minim(int** a, int** flux, int s, int d, vector<int>& tati) {
int mini = INT_MAX;
for (int i = d; i != s; i = tati[i]) {
if (mini > a[tati[i]][i] - flux[tati[i]][i]) {
mini = a[tati[i]][i] - flux[tati[i]][i];
}
}
return mini;
}
bool BFS(int** a, int** flux, int s, int d, vector<int>& tati) {
queue<int> q;
vector<bool> viz(tati.size(), false);
fill(tati.begin(), tati.end(), -1);
q.push(s);
viz[s] = true;
while (!q.empty()) {
int prim = q.front();
q.pop();
for (int i = 0; i < tati.size(); i++) {
if (a[prim][i] > 0 && !viz[i]) {
if (a[prim][i] - flux[prim][i] > 0) {
q.push(i);
tati[i] = prim;
viz[i] = true;
}
}
}
}
return viz[d];
}
int admond_penis(int** a, int** flux, int s, int d , vector<int>& tati) {
int fluxos = 0;
while (BFS(a, flux, s, d, tati)) {
int mini = flux_minim(a, flux, s, d, tati);
for (int i = d; i != s; i = tati[i]) {
flux[tati[i]][i] += mini;
flux[i][tati[i]] -= mini;
}
fluxos += mini;
}
return fluxos;
}
int main()
{
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int n, c, m;
fin >> n >> m;
c = 1;
int** a = new int* [n + 1];
int** flux = new int* [n + 1];
for (int i = 0; i <= n; i++) {
a[i] = new int[n + 1];
fill(a[i], a[i] + n + 1, 0);
flux[i] = new int[n + 1];
fill(flux[i], flux[i] + n + 1, 0);
}
vector<int> tati(n + 1, -1);
for (int i = 0; i < m; i++) {
int x, y, f;
fin >> x >> y >> f;
a[x][y] = f;
}
for (int i = 0; i < c; i++) {
a[n][i] = INT_MAX;
}
int pula =admond_penis(a, flux, n, n - 1, tati);
fout << pula;
for (int i = 0; i <= n; i++) {
delete[] a[i];
delete[] flux[i];
}
delete[] flux;
delete[] a;
return 0;
}