Pagini recente » Cod sursa (job #1370040) | Cod sursa (job #2130133) | Cod sursa (job #1758157) | Cod sursa (job #1889487) | Cod sursa (job #2207178)
#include <bits/stdc++.h>
using namespace std;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
// Flux maxim
const int NMax = 1e3 + 5;
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()) {
int tempNode = q.front(); q.pop();
for(auto vecin: G[tempNode]) {
if(!viz[vecin] && capacities[tempNode][vecin] - flux[tempNode][vecin] > 0) {
viz[vecin] = true;
tata[vecin] = tempNode;
q.push(vecin);
}
if(vecin == finalNode) {
foundPath = true;
}
}
}
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];
}
tempNode = finalNode;
while(tempNode != startNode) {
flux[tata[tempNode]][tempNode] += minFlux;
flux[tempNode][tata[tempNode]] = -flux[tata[tempNode]][tempNode];
tempNode = tata[tempNode];
}
maxFlux += minFlux;
}
cout << 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;
}