Pagini recente » Cod sursa (job #2208905) | Cod sursa (job #2283502) | Cod sursa (job #949038) | Monitorul de evaluare | Cod sursa (job #3324520)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
const int MAX = 1e9;
struct Muchie {
int x, y;
int flux;
};
int n, m, nrMuchii, i, j, niv[5002], destGlob;
Muchie muchii[2 * 502];
vector<int> gr[5002];
bool viz[5002];
static inline bool BFS(int surs, int dest) {
memset(viz, false, sizeof(viz));
queue<int> q;
q.push(surs);
viz[surs] = true;
while(!q.empty()) {
int nod = q.front();
q.pop();
for(int urm : gr[nod]) {
int nodUrm = muchii[urm].y;
if(viz[nodUrm] || muchii[urm].flux <= 0) continue;
viz[nodUrm] = true;
niv[nodUrm] = niv[nod] + 1;
q.push(nodUrm);
}
}
return viz[dest];
}
static inline int Flux(int nod, int flMa) {
if(flMa <= 0) return 0;
if(nod == destGlob) return max(flMa, 0);
int sum = 0;
for(int urm : gr[nod]) {
if(niv[muchii[urm].y] == niv[nod] + 1) {
int flCur = Flux(muchii[urm].y, min(flMa, muchii[urm].flux));
sum += flCur;
muchii[urm ].flux -= flCur;
muchii[urm ^ 1].flux += flCur;
flMa -= flCur;
}
}
return sum;
}
static inline int Dinic(int surs, int dest) {
destGlob = dest;
int rasp = 0;
while(BFS(surs, dest))
rasp += Flux(surs, MAX);
return rasp;
}
int main() {
//ios_base::sync_with_stdio(false);
fin.tie(nullptr);
fout.tie(nullptr);
fin >> n >> m;
for(i = 1; i <= m; i++) {
int x, y, c;
fin >> x >> y >> c;
muchii[++nrMuchii] = {x, y, c};
gr[x].push_back(nrMuchii);
muchii[++nrMuchii] = {y, x, 0};
gr[y].push_back(nrMuchii);
}
fout << Dinic(1, n);
return 0;
}