Pagini recente » Cod sursa (job #2278367) | Cod sursa (job #922809) | Cod sursa (job #1601887) | Cod sursa (job #2209689) | Cod sursa (job #2207184)
#include <bits/stdc++.h>
using namespace std;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
// Flux maxim
const int NMax = 1e3 + 10;
vector< vector< int > > G;
int capacities[NMax][NMax], flux[NMax][NMax];
vector< bool > viz;
vector< int > tata;
bool BFS(int startNode, int finalNode) {
fill(viz.begin(), viz.end(), false); fill(tata.begin(), tata.end(), -1);
queue< int > q;
q.push(startNode);
viz[startNode] = true;
bool foundPath = false;
while(!q.empty() && !foundPath) {
int tempNode = q.front(); q.pop();
for(auto vecin: G[tempNode]) {
if(!viz[vecin] && capacities[tempNode][vecin] - flux[tempNode][vecin] > 0) {
tata[vecin] = tempNode;
if(vecin == finalNode) {
foundPath = true;
break;
}
viz[vecin] = true;
q.push(vecin);
}
}
}
return foundPath;
}
void EdmondKarp(int startNode, int finalNode) {
int maxFlux = 0;
while(BFS(startNode, finalNode) == true) {
int tempNode = finalNode, minFlux = 1e9;
while(tempNode != startNode) {
minFlux = min(minFlux, capacities[tata[tempNode]][tempNode] - flux[tata[tempNode]][tempNode]);
tempNode = tata[tempNode];
}
maxFlux += minFlux;
tempNode = finalNode;
while(tempNode != startNode) {
flux[tata[tempNode]][tempNode] += minFlux;
flux[tempNode][tata[tempNode]] = -flux[tata[tempNode]][tempNode];
tempNode = tata[tempNode];
}
}
out << maxFlux << "\n";
}
int main() {
int n, m; in >> n >> m;
G.resize(n + 1); viz.resize(n + 1); tata.resize(n + 1);
for(int i = 1; i <= m; ++i) {
int x, y, capacity; in >> x >> y >> capacity;
G[x].push_back(y);
capacities[x][y] = capacity;
}
EdmondKarp(1, n);
return 0;
}