Pagini recente » Cod sursa (job #240967) | Cod sursa (job #1999755) | Cod sursa (job #282415) | Cod sursa (job #1706740) | Cod sursa (job #2816224)
#include <cstdio>
#include <cctype>
#include <algorithm>
#include <vector>
#include <queue>
#define BUF_SIZE 1 << 17
#define NMAX 1000
using namespace std;
FILE *fin = fopen("maxflow.in", "r");
FILE *fout = fopen("maxflow.out", "w");
char buf[BUF_SIZE];
int pos = BUF_SIZE;
inline char nextch(){
if(pos == BUF_SIZE){
fread(buf, BUF_SIZE, 1, fin);
pos = 0;
}
return buf[pos++];
}
inline int read(){
char ch = nextch();
while( !isdigit(ch) ){
ch = nextch();
}
int nr = 0;
while( isdigit(ch) ){
nr = nr * 10 + ch - '0';
ch = nextch();
}
return nr;
}
int N, M;
bool sel[NMAX + 1];
int t[NMAX + 1];
int c[NMAX + 1][NMAX + 1];
int f[NMAX + 1][NMAX + 1];
vector <int> G[NMAX + 1];
int BFS(int u, int v){
queue <int> Q;
for(int i = 1; i <= N; i++){
sel[i] = 0;
t[i] = -1;
}
Q.push(u);
sel[u] = 1;
t[u] = 0;
while( !Q.empty() ){
int node = Q.front();
Q.pop();
for(auto it : G[node]){
if( !sel[it] && f[node][it] < c[node][it] ){
Q.push(it);
sel[it] = 1;
t[it] = node;
}
}
}
return sel[v];
}
int main()
{
N = read();
M = read();
for(int i = 1; i <= M; i++){
int u, v;
u = read();
v = read();
c[u][v] = read();
G[u].push_back(v);
G[v].push_back(u);
}
int flux_total = 0;
while( BFS(1, N) ){
int node = t[N];
int flux_curent = c[node][N] - f[node][N];
while(node != 1){
int tata = t[node];
flux_curent = min(flux_curent, c[tata][node] - f[tata][node]);
node = tata;
}
flux_total += flux_curent;
node = t[N];
f[node][N] += flux_curent;
f[N][node] -= flux_curent; //graful rezidual
while(node != 1){
int tata = t[node];
f[tata][node] += flux_curent;
f[node][tata] -= flux_curent; //graful rezidual
node = tata;
}
}
fprintf(fout, "%d\n", flux_total);
}