Pagini recente » Cod sursa (job #2466982) | Cod sursa (job #815526) | Cod sursa (job #2839942) | Cod sursa (job #1634555) | Cod sursa (job #3261784)
#include <bits/stdc++.h>
using namespace std;
#define flow first
#define capacity second
pair<int, int> data[1010][1010];
int N, M;
vector<int> adj[1010];
int daddy[1010], visited[1010];
bool bfs(int source) {
for (int i = 0; i < 1010; i++) visited[i] = 0;
deque<int> dq;
dq.emplace_back(source);
daddy[source] = 0;
visited[source] = 1;
while (!dq.empty()) {
int node = dq.front(); dq.pop_front();
for (auto neigh : adj[node]) {
if (!visited[neigh] && Data[node][neigh].flow < Data[node][neigh].capacity) {
dq.emplace_back(neigh);
daddy[neigh] = node;
visited[neigh] = 1;
}
}
}
return visited[N];
}
int findMin(int node) {
int ans = INT_MAX;
while (daddy[node]) {
ans = min(ans, Data[daddy[node]][node].capacity - Data[daddy[node]][node].flow);
node = daddy[node];
}
assert(ans != INT_MAX);
return ans;
}
int sum = 0;
void updateFlow(int value, int node = N) {
sum += value;
while (daddy[node]) {
Data[daddy[node]][node].flow += value;
Data[node][daddy[node]].flow -= value;
node = daddy[node];
}
}
int main()
{
#ifndef OFFLINE
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
#endif // OFFLINE
cin.tie(0)->sync_with_stdio(0);
cin >> N >> M ;
for (int i = 1; i <= M; i++) {
int x, y, z; cin >> x >> y >> z;
Data[x][y].capacity = z;
adj[x].emplace_back(y);
adj[y].emplace_back(x);
}
while (bfs(1)) {
int mn = findMin(N);
updateFlow(mn, N);
}
cout << sum;
}