Pagini recente » Cod sursa (job #1973434) | Cod sursa (job #323640) | Cod sursa (job #2004055) | Cod sursa (job #430469) | Cod sursa (job #2236052)
//Edmons-Karp
#include <bits/stdc++.h>
using namespace std;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
const int NMAX = 1005;
struct Edge {
int to;
int cap;
int flow;
int rev;
};
vector<Edge> g[NMAX];
int n, m, src, dest, cap[NMAX][NMAX];
void addedge(int i, int j) {
Edge a = {j, cap[i][j], 0, g[j].size()};
Edge b = {i, cap[j][i], 0, g[i].size()};
g[i].push_back(a);
g[j].push_back(b);
// cout << i << " " << j << endl;
}
int visited[NMAX], nedge[NMAX];
int bfs() {
queue<int> q;
q.push(src);
visited[src] = -1;
bool flag = 0;
while(q.size()) {
auto from = q.front();
q.pop();
if(from == dest) {
flag = 1;
break;
}
for(int i = 0; i < g[from].size(); i ++) {
auto it = g[from][i];
if(!visited[it.to] && it.cap > it.flow) {
visited[it.to] = from;
nedge[it.to] = i;
q.push(it.to);
}
}
}
if(flag == 0)
return 0;
else {
int ans = INT_MAX, node = dest;
while(node != 1) {
Edge e = g[visited[node]][nedge[node]];
ans = min(ans, e.cap - e.flow);
node = visited[node];
}
node = dest;
while(node != 1) {
Edge &e = g[visited[node]][nedge[node]];
e.flow += ans;
Edge &rev = g[node][e.rev];
rev.flow -= ans;
node = visited[node];
}
return ans;
}
}
int main() {
in >> n >> m;
for(int i = 1; i <= m; i ++) {
int x, y, c;
in >> x >> y >> c;
cap[x][y] = c;
}
for(int i = 1; i <= n; i ++)
for(int j = i + 1; j <= n; j ++)
if(cap[i][j] || cap[j][i])
addedge(i, j);
src = 1;
dest = n;
int maxflow = 0, aux = bfs();
while(aux) {
for(int i = 1; i <= n; i ++)
visited[i] = 0;
maxflow += aux;
aux = bfs();
}
out << maxflow;
return 0;
}