Nu aveti permisiuni pentru a descarca fisierul grader_test1.ok
Cod sursa(job #2695087)
Utilizator | Data | 11 ianuarie 2021 18:47:06 | |
---|---|---|---|
Problema | Flux maxim | Scor | 100 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva educationala | Marime | 1.77 kb |
#include <bits/stdc++.h>
using namespace std;
struct MaxFlow {
static const int VMAX = 1010;
static const int inf = 1e9;
int cap[VMAX][VMAX], tata[VMAX];
char vaz[VMAX];
vector<int> v[VMAX];
queue<int> q;
void add_edge(int x, int y, int c) {
cap[x][y] = c;
v[x].push_back(y);
v[y].push_back(x);
}
bool bfs(int sursa, int dest) {
memset(vaz, 0, sizeof(vaz));
vaz[sursa] = 1;
q.push(sursa);
while(!q.empty()) {
int nod = q.front();
q.pop();
for (int vec : v[nod]) {
if (vaz[vec] or !cap[nod][vec]) continue;
vaz[vec] = 1;
tata[vec] = nod;
if (vec != dest) q.push(vec);
}
}
return vaz[dest] > 0;
}
int flow(int sursa, int dest) {
int flw = 0;
while(bfs(sursa, dest)) {
for (int vec : v[dest]) {
if (!vaz[vec] or !cap[vec][dest]) continue;
int s = inf;
tata[dest] = vec;
for (int nod = dest; nod != sursa; nod = tata[nod]) s = min(s, cap[tata[nod]][nod]);
for (int nod = dest; nod != sursa; nod = tata[nod]) {
cap[tata[nod]][nod] -= s;
cap[nod][tata[nod]] += s;
}
flw += s;
}
}
return flw;
}
} mf;
int main()
{
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
int n, m, x, y, c;
scanf("%d%d", &n, &m);
for (int i = 1; i <= m; ++i) {
scanf("%d%d%d", &x, &y, &c);
mf.add_edge(x, y, c);
}
printf("%d",mf.flow(1, n));
return 0;
}