Pagini recente » Cod sursa (job #1346132) | Cod sursa (job #1355649) | Cod sursa (job #1759376) | Cod sursa (job #533057) | Cod sursa (job #1808324)
#include <fstream>
#include <vector>
#include <utility>
#include <iostream>
#include <queue>
#define MAX_SIZE 110001
using namespace std;
int main() {
ifstream in;
ofstream out;
in.open("maxflow.in");
out.open("maxflow.out");
int n, m, x, y, cap, fluxMax;
queue<int> my_queue;
vector<int> bfs;
bool end;
std::vector<int> visited(n + 1);
int aux, capacity, flux, coloumn, line, min;
in>>n>>m;
vector< vector<pair <int, int> > > graph;
for(int i = 0; i <= n; i++) {
graph.push_back(vector<pair <int, int> > (n + 1));
}
for(int i = 0; i < m; i++) {
in>>x>>y>>cap;
graph[x][y] = pair<int, int>(cap, 0);
}
fluxMax = 0;
while(true) {
while(!my_queue.empty()) {
my_queue.pop();
}
my_queue.push(1);
visited[1] = 1;
end = false;
while(!my_queue.empty() && !end) {
aux = my_queue.front();
my_queue.pop();
bfs.push_back(aux);
for(int i = 1; i < n + 1; i++) {
if(!visited[i]) {
capacity = graph[aux][i].first;
flux = graph[aux][i].second;
if(flux < 0) {
visited[i] = 1;
my_queue.push(i);
if(i == n) {
end = true;
}
} else {
if(capacity - flux > 0) {
visited[i] = 1;
my_queue.push(i);
if(i == n) {
end = true;
}
}
}
}
}
}
/*if(end)
cout<<"true\n";
else
cout<<"false\n";
cout<<"sir : ";
for(int i = 0; i < bfs.size(); i++) {
cout<<bfs[i]<<' ';
}
cout<<'\n';
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= n; j++) {
cout<<graph[i][j].second<<' ';
}
cout<<'\n';
}*/
if(end) {
for(int i = 1; i <= n; i++) {
visited[i] = 0;
}
bfs.push_back(n);
min = MAX_SIZE;
for(int i = 0; i < bfs.size() - 1; i++) {
line = bfs[i];
coloumn = bfs[i + 1];
capacity = graph[line][coloumn].first;
flux = graph[line][coloumn].second;
if(flux < 0) {
if(-flux < min) {
min = -flux;
}
} else {
if(capacity - flux > 0) {
if(capacity - flux < min) {
min = capacity - flux;
}
}
}
}
for(int i = 0; i < bfs.size() - 1; i++) {
line = bfs[i];
coloumn = bfs[i + 1];
graph[line][coloumn].second += min;
graph[coloumn][line].second = -graph[line][coloumn].second;
}
fluxMax += min;
bfs.clear();
} else {
out<<fluxMax<<'\n';
break;
}
}
/*for(int i = 1; i <= n; i++) {
for(int j = 1; j <= n; j++) {
cout<<graph[i][j].second<<' ';
}
cout<<'\n';
}*/
in.close();
out.close();
return 0;
}