Pagini recente » Cod sursa (job #983181) | Cod sursa (job #1292118) | Cod sursa (job #2242421) | Cod sursa (job #41151) | Cod sursa (job #870182)
Cod sursa(job #870182)
#include <fstream>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
const int N = 1001;
int cap[N][N], flux[N][N], T[N], n;
bool use[N];
vector<int> graph[N];
queue<int> Q;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
void get_graph(){
int m, x, y, c;
in >> n >> m;
while (m--){
in >> x >> y >> c;
cap[x][y] = c;
graph[x].push_back(y);
graph[y].push_back(x);
}
}
inline int augment(int x, int y){
return cap[x][y] - flux[x][y];
}
bool bfs(int S, int D){
memset(T, 0, sizeof(T));
memset(use, false, sizeof(use));
Q.push(S);
use[S] = true;
int x;
while (!Q.empty()){
x = Q.front();
Q.pop();
if (x == D)
continue;
for (vector<int> :: iterator it = graph[x].begin() ; it != graph[x].end() ; it++)
if (!use[*it] && augment(x, *it)){
use[*it] = true;
Q.push(*it);
T[*it] = x;
}
}
return use[D];
}
int maxFlow(int S, int D){
int F = 0;
while (bfs(S, D))
for (int x = 1 ; x <= n ; x++){
if (!use[x] || !augment(x, D))
continue;
int add = augment(x, D);
for (int i = x ; i != S ; i = T[i])
add = min(add, augment(T[i], i));
T[D] = x;
F += add;
for (int i = D ; i != S ; i = T[i]){
flux[ T[i] ][i] += add;
flux[i][ T[i] ] -= add;
}
}
return F;
}
int main(){
get_graph();
out << maxFlow(1, n) << "\n";
return 0;
}