Pagini recente » Borderou de evaluare (job #533666) | Borderou de evaluare (job #516461) | Borderou de evaluare (job #533657) | Borderou de evaluare (job #1979482) | Cod sursa (job #3348873)
#include <fstream>
#include <set>
#include <queue>
using namespace std;
ifstream fin ("maxflow.in");
ofstream fout ("maxflow.out");
const int mxN = 1e3 + 1;
int cap[mxN][mxN], n, m;
bool visited[mxN];
set<int> G[mxN];
void modEdge(int a, int b, int c){
cap[a][b] += c;
if(!cap[a][b])
G[a].erase(b);
else
G[a].insert(b);
}
int maxFlow(int start){
int prev[mxN] = {0};
queue<int> Q;
Q.push(start);
for(int i = 1; i <= n; i++)
visited[i] = false;
visited[start] = true;
while(!Q.empty() && !visited[n]){
int u = Q.front(); Q.pop();
for(int v : G[u]){
if(!visited[v] && cap[u][v] > 0){
visited[v] = true;
prev[v] = u;
Q.push(v);
}
}
}
if(!visited[n]) return 0;
// Find bottleneck
int flow = 111000;
for(int v = n; v != start; v = prev[v]){
int u = prev[v];
flow = min(flow, cap[u][v]);
}
// Update residual capacities
for(int v = n; v != start; v = prev[v]){
int u = prev[v];
modEdge(u, v, -flow);
modEdge(v, u, +flow);
}
return flow;
}
int main(){
int ans = 0, f;
fin >> n >> m;
for(int i = 1; i <= m; i++){
int a, b, c;
fin >> a >> b >> c;
modEdge(a, b, c);
}
do{
f = maxFlow(1);
ans += f;
}while(f != 0);
fout << ans;
}