Pagini recente » Cod sursa (job #354613) | Cod sursa (job #2712749) | Cod sursa (job #2841393) | Cod sursa (job #1867785) | Cod sursa (job #2747121)
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ld long double
#define all(a) (a).begin(), (a).end()
#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast")
#define fr first
#define sc second
//#define int long long
#define rc(s) return cout<<s,0
#define rcc(s) cout<<s,exit(0)
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
const int nmax = 1005;
int n, m, capacity[nmax][nmax];
vector<int>nod[nmax];
bool bfs(int s, int t, vector<int>&parent, vector<pair<int,int>>&lista){
for(int i=1;i<=n;i++){
parent[i] = -1;
}
parent[s] = 0;
queue<pair<int,int>>Q;
Q.push({s, 1e6});
while(Q.size()){
auto it = Q.front();
Q.pop();
for(auto i : nod[it.fr]){
if(parent[i] == -1 && capacity[it.fr][i]){
if(i == t){
lista.push_back({it.fr, min(it.sc, capacity[it.fr][i])});
}
else{
parent[i] = it.fr;
Q.push({i, min(it.sc, capacity[it.fr][i])});
}
}
}
}
if(lista.size()) return true;
else return false;
}
int maxflow(int s, int t){
int flow = 0;
vector<int>parent(nmax);
vector<pair<int,int>>lista;
while(bfs(s, t, parent, lista) == true){
for(auto x : lista){
flow += x.sc;
capacity[x.fr][t] -= x.sc;
capacity[t][x.fr] += x.sc;
int curr = x.fr;
while(parent[curr]){
capacity[parent[curr]][curr] -= x.sc;
capacity[curr][parent[curr]] += x.sc;
curr = parent[curr];
}
}
lista.clear();
}
return flow;
}
int32_t main(){
ios_base::sync_with_stdio(false);cin.tie(0);cerr.tie(0);cout.tie(0);
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
cin >> n >> m;
for(int i=1;i<=m;i++){
int x, y, z;
cin >> x >> y >> z;
nod[x].push_back(y);
nod[y].push_back(x);
capacity[x][y] = z;
}
cout << maxflow(1, n) << '\n';
}