Pagini recente » Cod sursa (job #842032) | Cod sursa (job #2839178) | Cod sursa (job #1749998) | Cod sursa (job #2265596) | Cod sursa (job #2814529)
#include <bits/stdc++.h>
using namespace std;
const int NMAX = 1e3,INF = 2e9;
int padre[NMAX + 5],viz[NMAX + 5];
struct Edge {
int from,to,cap,flow,next;
}e;
vector <Edge> edges;
vector <int> start(NMAX + 5);
int ans;
queue <int> q;
void init(int n) {
for (int i = 1;i <= n;i++) {
viz[i] = 0;
padre[i] = -1;
}
}
bool bfs(int src, int dest) {
int node = src;
q.push(node);
viz[node] = 1;
while (!q.empty()) {
node = q.front();
q.pop();
for (int it = start[node];it != -1;it = edges[it].next) {
if (!viz[edges[it].to] && edges[it].cap > edges[it].flow) {
viz[edges[it].to] = 1;
padre[edges[it].to] = it;
q.push(edges[it].to);
}
}
}
return(node == dest);
}
int fill_flow(int src, int node, int mn = INF) {
if (node == src)
return mn;
int flow = fill_flow(src, edges[padre[node]].from, min(mn, edges[padre[node]].cap - edges[padre[node]].flow));
edges[padre[node]].flow += flow;
edges[padre[node] ^ 1].flow -= flow;
return flow;
}
void push_flow(int src, int dest) {
for (int it = start[dest];it != -1;it = edges[it].next) {
if (edges[it ^ 1].cap - edges[it ^ 1].flow > 0 && viz[edges[it ^ 1].from]) {
padre[dest] = it ^ 1;
ans += fill_flow(src, dest);
}
}
}
int main()
{
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int n,m,u,v,c,src,dest;
fin >> n >> m;
src = 1;
dest = n;
for (int i = 1;i <= n;i++) {
padre[i] = -1;
start[i] = -1;
}
for (int i = 0;i < m;i++) {
fin >> u >> v >> c;
e.from = u;
e.to = v;
e.cap = c;
e.flow = 0;
e.next = start[u];
edges.push_back(e);
start[u] = edges.size() - 1;
e.from = v;
e.to = u;
e.cap = 0;
e.flow = 0;
e.next = start[v];
edges.push_back(e);
start[v] = edges.size() - 1;
}
// for (int i = 0;i < edges.size();i++) {
// fout << edges[i].from << " " << edges[i].to << " " << edges[i].cap << " " << edges[i].flow << " " << edges[i].next << '\n';
// }
// for (int i = 1;i <= n;i++)
// fout << start[i] << '\n';
while (bfs(src, dest)) {
push_flow(src, dest);
init(n);
}
fout << ans;
return 0;
}