Pagini recente » Cod sursa (job #430450) | Cod sursa (job #2461501) | Cod sursa (job #3141060) | Cod sursa (job #1540000) | Cod sursa (job #2388209)
#include <bits/stdc++.h>
using namespace std;
#define N 1005
int n, m, p[N];
long long maxflow;
struct edge{
int from, to, c;
} M[10*N];
vector <int> v[N];
queue <int> Q;
bool viz[N];
inline int T(int q){
return (q > m ? q - m : q + m);
}
bool bfs(){
for (int i=1; i<=n; i++) viz[i] = 0;
viz[1] = 1; Q.push(1);
while (!Q.empty()){
int nod = Q.front();
Q.pop();
if (nod == n) continue;
for (auto it: v[nod]){
if (viz[M[it].to] || !M[it].c) continue;
p[M[it].to] = it; Q.push(M[it].to);
viz[M[it].to] = 1;
}
}
return viz[n];
}
int main(){
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
ifstream cin ("mincut.in");
ofstream cout ("mincut.out");
cin >> n >> m;
for (int i=1, x, y, z; i<=m; i++){
cin >> x >> y >> z;
M[i] = {x, y, z};
M[i+m] = {y, x, 0};
v[x].push_back(i);
v[y].push_back(m+i);
}
while (bfs()){
for (auto it: v[n]){
if (!viz[M[it].to] || !M[T(it)].c) continue;
p[n] = T(it);
int flow = 1e9;
for (int nod = n; nod != 1; nod = M[p[nod]].from)
flow = min(flow, M[p[nod]].c);
for (int nod = n; nod != 1; nod = M[p[nod]].from){
M[p[nod]].c -= flow;
M[T(p[nod])].c += flow;
}
maxflow += flow;
}
}
for (int i=1; i<=n; i++) viz[i] = 0;
cout << maxflow << '\n';
/*
Q.push(1); viz[1] = 1;
while (!Q.empty()){
int nod = Q.front();
Q.pop();
for (auto it: v[nod]){
if (it > m || viz[M[it].to]) continue;
if (!M[it].c) cout << M[it].from << " " << M[it].to << '\n';
else Q.push(M[it].to), viz[M[it].to] = 1;
}
}
*/
return 0;
}