Pagini recente » Cod sursa (job #882438) | Cod sursa (job #2165519) | Cod sursa (job #619534) | Cod sursa (job #423363) | Cod sursa (job #2640383)
#include <cstdio>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
const int INF=(int)1e9;
const int NMAX=(int)1e3;
int N, cap[NMAX+1][NMAX+1], par[NMAX+1];
vector<int> adj[NMAX+1];
bool bfs() {
par[1]=0;
for(int i=2;i<=N;++i)
par[i]=-1;
queue<int> q;
q.push(1);
while(!q.empty()) {
int v=q.front();
q.pop();
for(auto e:adj[v]) {
if(cap[v][e]>0 && par[e]==-1) {
par[e]=v;
q.push(e);
}
}
}
return (par[N]!=-1);
}
int main() {
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
int M;
scanf("%d %d", &N, &M);
for(int i=1;i<=M;++i) {
int a, b;
scanf("%d %d", &a, &b);
adj[a].push_back(b);
adj[b].push_back(a);
scanf("%d", &cap[a][b]);
}
int flow=0;
while(bfs()) {
vector<int> nodes;
int cur=N;
while(cur>1) {
nodes.push_back(cur);
cur=par[cur];
}
nodes.push_back(1);
reverse(nodes.begin(), nodes.end());
int mn=INF, sz=(int)nodes.size();
for(int i=0;i<sz-1;++i) {
mn=min(mn, cap[nodes[i]][nodes[i+1]]);
}
flow+=mn;
for(int i=0;i<sz-1;++i) {
cap[nodes[i]][nodes[i+1]]-=mn;
cap[nodes[i+1]][nodes[i]]+=mn;
}
}
printf("%d\n", flow);
return 0;
}