Pagini recente » Cod sursa (job #569667) | Cod sursa (job #2142733) | Cod sursa (job #1215140) | Cod sursa (job #622974) | Cod sursa (job #3137533)
#include <iostream>
#include <vector>
using namespace std;
const int MAXN = 1000;
const int MAXM = 5000;
const int NIL = -1;
const int INF = 2e9;
struct info{
int to, id;
};
std::vector <info> adj[MAXN];
int viz[MAXN];
info prevv[MAXN];
int edgesCap[MAXN * 2];
int edgesCapSize;
int flowSize;
int q[MAXN];
int pq, uq;
bool bfs(){
int u;
for( u = 0 ; u < flowSize; u++ )
viz[u] = false;
q[0] = 0;
prevv[0].to = NIL;
viz[0] = true;
pq = 0;
uq = 1;
while( pq < uq && q[pq] != flowSize - 1 ){
u = q[pq++];
for( info v : adj[u] ){
if( !viz[v.to] && edgesCap[v.id] ) {
viz[v.to] = true;
prevv[v.to].to = u;
prevv[v.to].id = v.id;
q[uq++] = v.to;
}
}
}
return viz[flowSize - 1];
}
int makeFlux() {
int flux, delta, a;
flux = 0;
while( bfs() ){
for( info aux : adj[flowSize - 1] ) {
prevv[flowSize - 1].to = aux.to;
prevv[flowSize - 1].id = aux.id ^ 1;
delta = +INF;
for( a = flowSize - 1; a; a = prevv[a].to ) {
delta = min(delta, edgesCap[prevv[a].id]);
}
flux += delta;
for( a = flowSize - 1; a; a = prevv[a].to ) {
edgesCap[prevv[a].id] -= delta;
edgesCap[prevv[a].id ^ 1] += delta;
}
}
}
return flux;
}
void addEdge(int a, int b, int cap) {
adj[a].push_back({b, edgesCapSize});
edgesCap[edgesCapSize] = cap;
edgesCapSize++;
adj[b].push_back({a, edgesCapSize});
edgesCap[edgesCapSize] = 0;
edgesCapSize++;
}
int main(){
FILE *fin, *fout;
fin = fopen("maxflow.in", "r");
fout = fopen("maxflow.out", "w");
int m, i, a, b, aux;
fscanf(fin, "%d%d", &flowSize, &m);
edgesCapSize = 0;
for( i = 0 ; i < m ; i++ ) {
fscanf(fin, "%d%d%d", &a, &b, &aux);
a--;
b--;
addEdge(a, b, aux);
}
fprintf(fout, "%d\n", makeFlux());
fclose(fin);
fclose(fout);
return 0;
}