Pagini recente » Atasamentele paginii Clasament simulare-cartita-12 | Atasamentele paginii Clasament oni_2009_1_10 | Cod sursa (job #348511) | Cod sursa (job #487769) | Cod sursa (job #2881640)
#include <cstdio>
#include <vector>
#include <cstring>
#include <queue>
using namespace std;
#define Nmax 1003
#define Cmax 110100
int N, M;
vector<int> G[Nmax];
int C[Nmax][Nmax];
int F[Nmax][Nmax];
int vis[Nmax];
int parent[Nmax];
void pushflow() {
int node = N;
int prev = parent[node];
int min_flow = Cmax;
while(prev != 0) {
int flow = 0;
if(F[prev][node] == 0) {
flow += F[node][prev] + C[prev][node];
}
else {
flow += C[prev][node] - F[prev][node];
}
if(flow < min_flow) {
min_flow = flow;
}
node = prev;
prev = parent[prev];
}
node = N;
prev = parent[node];
while(prev != 0) {
if(F[node][prev] == 0) {
F[prev][node] += min_flow;
}
else {
if(F[node][prev] >= min_flow) {
F[node][prev] -= min_flow;
}
else {
int aux = min_flow - F[node][prev];
F[node][prev] = 0;
F[prev][node] += aux;
}
}
node = prev;
prev = parent[prev];
}
}
int bfs() {
memset(vis, 0, sizeof(vis));
memset(parent, 0, sizeof(parent));
vis[1] = 1;
parent[1] = 0;
queue<int> q;
q.push(1);
while(!q.empty()) {
int node = q.front();
q.pop();
if(node == N) {
pushflow();
return 1;
}
for(auto j = G[node].begin(); j != G[node].end(); j++) {
if(vis[*j] != 1) {
if(F[node][*j] < C[node][*j] || F[*j][node] > 0) {
vis[*j] = 1;
parent[*j] = node;
q.push(*j);
}
}
}
}
return 0;
}
int main() {
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
scanf("%d %d", &N, &M);
for(int i = 1; i <= M; i++) {
int x, y, c;
scanf("%d %d %d", &x, &y, &c);
G[x].push_back(y);
G[y].push_back(x);
C[x][y] = c;
}
while(bfs());
int res = 0;
for(int i = 2; i <= N; i++) {
res += F[1][i];
}
printf("%d", res);
/*printf("%d %d\n", N, M);
for(int i = 1; i <= N; i++) {
printf("Node %d: ", i);
for(auto j = G[i].begin(); j != G[i].end(); j++) {
printf("(%d, %d) ", *j, F[i][*j]);
}
printf("\n");
}
return 0;*/
}