Pagini recente » Monitorul de evaluare | Istoria paginii runda/ada20/clasament | Istoria paginii runda/budescupleaca | Cod sursa (job #1949064) | Cod sursa (job #1466730)
#include <cstdio>
#include <cstdlib>
#include <cassert>
#include <vector>
#include <list>
#include <queue>
#include <cstring>
using namespace std;
#define ProblemName "maxflow"
#define MCONCAT(A, B) A B
#ifdef ProblemName
#define InFile MCONCAT(ProblemName, ".in")
#define OuFile MCONCAT(ProblemName, ".out")
#else
#define InFile "fis.in"
#define OuFile "fis.out"
#endif
#define MAXN 1010
//int flow[MAXN][MAXN];
//int capacity[MAXN][MAXN];
class graph {
private:
vector< list<int> > adiac;
vector< vector<int> > flow;
vector < vector<int> > capacity;
public:
graph(int N) {
adiac.resize(N);
flow.assign(N, vector<int>(N));
capacity.assign(N, vector<int>(N));
}
void newEdge(int n1, int n2, int c, int enr) {
adiac[n1].push_back(n2);
adiac[n2].push_back(n1);
flow[n1][n2] = flow[n2][n1] = 0;
capacity[n1][n2] = capacity[n2][n1] = c;
}
bool isSaturated(int n1, int n2) {
if (capacity[n1][n2] - flow[n1][n2] == 0 || capacity[n2][n1] - flow[n2][n1] == 0)
return true;
return false;
}
int sendFlows(vector<char>& visited, vector<int>& parent, queue<int>& Q) {
memset(&visited[0], 0, sizeof(visited[0]) * visited.size());
int endNod = adiac.size() - 1;
int s = 0;
while (!Q.empty())
Q.pop();
Q.push(0);
parent[0] = -1; visited[0] = 1;
while (!Q.empty()) {
int t = Q.front();
Q.pop();
for (auto i = adiac[t].begin(); i != adiac[t].end(); ++i) {
if (visited[*i] || capacity[t][*i] - flow[t][*i] == 0)
continue;
if (*i == endNod) {
int M = capacity[t][*i] - flow[t][*i];
int aux = t;
while (parent[aux] != -1) {
int availableFlow = capacity[parent[aux]][aux] - flow[parent[aux]][aux];
if (!availableFlow)
break;
M = availableFlow < M ? availableFlow : M;
aux = parent[aux];
}
if (parent[aux] != -1 || !M)
continue;
flow[t][endNod] += M;
flow[endNod][t] -= M;
aux = t;
while (parent[aux] != -1) {
flow[parent[aux]][aux] += M;
flow[aux][parent[aux]] -= M;
aux = parent[aux];
}
s += M;
}
else {
visited[*i] = 1;
parent[*i] = t;
Q.push(*i);
}
}
}
return s;
}
int EdmondsKarp() {
int s = 0;
vector<char> visited(adiac.size());
vector<int> parent(adiac.size());
queue<int> Q;
while (true) {
int sentFlow = sendFlows(visited, parent, Q);
if (!sentFlow)
break;
s += sentFlow;
}
return s;
}
};
int main() {
assert(freopen(InFile, "r", stdin));
assert(freopen(OuFile, "w", stdout));
int N, M;
scanf("%d%d", &N, &M);
graph G(N);
for (int i = 0; i < M; i++) {
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
G.newEdge(a - 1, b - 1, c, i);
}
printf("%d\n", G.EdmondsKarp());
return 0;
}