Pagini recente » Cod sursa (job #5596) | Cod sursa (job #1565033) | Cod sursa (job #1047197) | Cod sursa (job #317078) | Cod sursa (job #1172747)
#include<fstream>
#include<vector>
#include<queue>
#include<bitset>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
vector<int> adj[1000];
bitset<1000> viz;
queue<int> nodesCloseToSink;
int capacity[1000][1000], parent[1000];
int maximumFlow, n, m;
void bfs() {
int current;
queue<int> q;
q.push(0);
viz[0] = 1;
parent[0] = 0;
while(!q.empty()) {
current = q.front();
q.pop();
for(vector<int>::iterator it = adj[current].begin(); it != adj[current].end(); ++it) {
if(capacity[current][*it] > 0 && viz[*it] == 0) {
if(*it != n-1) {
q.push(*it);
viz[*it] = 1;
parent[*it] = current;
} else {
nodesCloseToSink.push(current);
}
}
}
}
}
void maxFlow() {
bool finished = false;
int current, min, auxCurrent;
while(!finished) {
viz.reset();
bfs();
if(nodesCloseToSink.size() == 0) {
finished = true;
} else {
while(nodesCloseToSink.size() > 0) {
current = nodesCloseToSink.front();
nodesCloseToSink.pop();
min = capacity[current][n-1];
auxCurrent = current;
while(auxCurrent != parent[auxCurrent]) {
if(min > capacity[parent[auxCurrent]][auxCurrent]) {
min = capacity[parent[auxCurrent]][auxCurrent];
}
auxCurrent = parent[auxCurrent];
}
auxCurrent = current;
capacity[current][n-1] -= min;
capacity[n-1][current] += min;
while(auxCurrent != parent[auxCurrent]) {
capacity[parent[auxCurrent]][auxCurrent] -= min;
capacity[auxCurrent][parent[auxCurrent]] += min;
auxCurrent = parent[auxCurrent];
}
maximumFlow += min;
}
}
}
}
int main() {
int i, u, v, c;
fin >> n >> m;
for(i = 0; i < m; i++) {
fin >> u >> v >> c;
u--, v--;
adj[u].push_back(v);
capacity[u][v] = c;
}
maxFlow();
fout << maximumFlow;
return 0;
}