Pagini recente » Cod sursa (job #744618) | Statistici Groza Marius-Cristian (forever_yang) | Cod sursa (job #2579949) | Cod sursa (job #1087448) | Cod sursa (job #2171618)
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
#define MAXN 1005
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int N, M, sol, c[MAXN][MAXN], f[MAXN][MAXN];
int dad[MAXN], viz[MAXN];
vector <int> graph[MAXN];
queue <int> Q;
void Read() {
int x, y, z;
fin >> N >> M;
for (int i = 1; i <= M; i++) {
fin >> x >> y >> z;
graph[x].push_back(y);
graph[y].push_back(x);
c[x][y] = z;
}
}
inline void Refa(int node) {
int nod = node, minim = 0x3f3f3f3f;
while (dad[nod]) {
minim = min(minim, c[dad[nod]][nod] - f[dad[nod]][nod]);
nod = dad[nod];
}
while (dad[node]) {
f[dad[node]][node] += minim;
f[node][dad[node]] -= minim;
node = dad[node];
}
//if (minim) ok = 1;
sol += minim;
}
inline int BFS(int start) {
int z;
Q.push(start); memset(viz, 0, sizeof(viz));
viz[start] = 1; dad[1] = 0;
while (!Q.empty()) {
z = Q.front();
for (auto x : graph[z]) {
if (x == N)
continue;
if (viz[x] == 0 && c[z][x] - f[z][x] > 0) {
Q.push(x); dad[x] = z; viz[x] = 1;
}
}
Q.pop();
}
int ok = 0;
for (auto x : graph[N]) {
if (viz[x] == 1 && c[x][N] - f[x][N] > 0) {
dad[N] = x;
Refa(N); ok = 1;
}
}
return ok;
}
void Solve() {
while (BFS(1));
fout << sol;
}
int main () {
Read();
Solve();
fin.close(); fout.close(); return 0;
}