Pagini recente » Cod sursa (job #1091754) | Cod sursa (job #1447616) | Cod sursa (job #1915466) | Cod sursa (job #1778209) | Cod sursa (job #2082826)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream f ("maxflow.in");
ofstream g ("maxflow.out");
const int INF = (1 << 30);
const int NMAX = 1000;
int n;
bool vizitat[NMAX + 1];
int from[NMAX + 1];
int capacitate[NMAX + 1][NMAX + 1];
int flux[NMAX + 1][NMAX + 1];
vector <int> graf[NMAX + 1];
void citeste() {
int m, a, b, c;
f >> n >> m;
for (int i = 1; i <= m; i++) {
f >> a >> b >> c;
graf[a].push_back(b);
graf[b].push_back(a);
capacitate[a][b] += c;
}
}
bool BFS(int sursa, int destinatie) {
queue <int> q;
for (int i = 1; i <= n; i++) vizitat[i] = false;
q.push(sursa);
vizitat[sursa] = false;
while (!q.empty()) {
int nod = q.front();
q.pop();
if (nod == destinatie) break;
int l = graf[nod].size();
for (int i = 0; i < l; i++) {
int fiu = graf[nod][i];
if (vizitat[fiu]) continue;
if (flux[nod][fiu] >= capacitate[nod][fiu]) continue;
vizitat[fiu] = true;
q.push(fiu);
from[fiu] = nod;
}
}
return vizitat[destinatie];
}
void rezolva(int sursa, int destinatie) {
int sol = 0;
while (BFS(sursa, destinatie)) {
int nr_fii = graf[destinatie].size();
for (int i = 0; i < nr_fii; i++) {
int nod = graf[destinatie][i];
if (!vizitat[nod]) continue;
from[destinatie] = nod;
nod = destinatie;
int minim = INF;
int ant;
while (nod != sursa) {
ant = from[nod];
minim = min(minim, capacitate[ant][nod] - flux[ant][nod]);
nod = ant;
}
nod = destinatie;
while (nod != sursa) {
ant = from[nod];
flux[ant][nod] += minim;
flux[nod][ant] -= minim;
nod = ant;
}
sol += minim;
}
}
g << sol << '\n';
}
int main() {
citeste();
rezolva(1, n);
return 0;
}