Pagini recente » Cod sursa (job #141449) | Cod sursa (job #1973659) | Cod sursa (job #1734189) | Cod sursa (job #1604919) | Cod sursa (job #3329733)
#include<fstream>
#include<iostream>
#include <queue>
#include <cstring>
#define MAXN 10001
using namespace std;
int n, m;
int rezid[MAXN][MAXN];
vector<int> lrezid[MAXN];
int viz[MAXN], tata[MAXN];
int bfs() {
int s = 0;
int t = n - 1;
for (int i = 0; i < n; i++) {
viz[i] = 0;
tata[i] = 0;
}
queue<int> q;
q.push(s);
viz[s] = 1;
while (!q.empty()) {
int x = q.front();
q.pop();
for (int y : lrezid[x]) {
if (!viz[y] && rezid[x][y] > 0) {
viz[y] = 1;
tata[y] = x;
if (y == t)
return 1;
q.push(y);
}
}
}
return 0;
}
int main() {
ifstream fs("maxflow.in");
ofstream g("maxflow.out");
fs >> n >> m;
for (int i = 0; i < m; i++) {
int x, y, c;
fs >> x >> y >> c;
x--; y--;
lrezid[x].push_back(y);
lrezid[y].push_back(x);
rezid[x][y] += c;
}
fs.close();
int fmax = 0;
int s = 0;
int t = n - 1;
while (bfs()) {
int iP = 110001;
t=n-1;
while(t!=0) {
if(iP>rezid[tata[t]][t])
iP= rezid[tata[t]][t];
t=tata[t];
}
t=n-1;
while(t!=0) {
rezid[tata[t]][t]-=iP;
rezid[t][tata[t]]+=iP;
t=tata[t];
}
fmax += iP;
}
g << fmax;
g.close();
return 0;
}