Pagini recente » Cod sursa (job #2287386) | Cod sursa (job #1451176) | Cod sursa (job #1088876) | Cod sursa (job #987039) | Cod sursa (job #2498764)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
const int INF = 210000;
struct Edge{
int dest;
long long f;
long long c;
int rev;
};
class Residual_graph {
int V;
vector<Edge> *G;
int *level;
public:
Residual_graph( int V ) {
this->V = V;
G = new vector<Edge> [V + 1];
level = new int[V + 1];
}
void add_edge( int u, int v, long long capacity ) {
Edge a{v, 0, capacity, G[v].size()};
Edge b{u, 0, 0, G[u].size()};
G[u].push_back(a);
G[v].push_back(b);
}
bool BFS(int source, int sink);
long long push_flow(int node, int sink, int start[], long long flow);
long long Dinic(int source, int sink);
};
bool Residual_graph::BFS(int source, int sink) {
for( int i = 1; i <= V; i ++ )
level[i] = -1;
level[source] = 0;
queue<int> q;
q.push(source);
while( !q.empty() ) {
int node = q.front();
q.pop();
for( auto it : G[node] ) {
if( level[it.dest] == -1 && it.f < it.c ) {
level[it.dest] = level[node] + 1;
q.push(it.dest);
}
}
}
return (level[sink] > 0);
}
long long Residual_graph::push_flow(int node, int sink, int start[], long long flow) {
if( node == sink )
return flow;
for( ; start[node] < G[node].size(); start[node] ++ ) {
Edge &e = G[node][start[node]];
if( level[node] + 1 == level[e.dest] && e.f < e.c ) {
long long tempflow = push_flow(e.dest,sink,start,min(flow, e.c - e.f));
if( tempflow > 0 ) {
e.f += tempflow;
G[e.dest][e.rev].f -= tempflow;
return tempflow;
}
}
}
return 0;
}
long long Residual_graph::Dinic( int source, int sink ) {
long long maxflow = 0;
while( BFS(source,sink) == true ) {
int start[V + 1] = {0};
while( int tempflow = push_flow(source,sink,start,INF) )
maxflow += tempflow;
}
return maxflow;
}
int main() {
int n, m;
fin>>n>>m;
Residual_graph graph(n);
for( int i = 1; i <= m; i ++ ) {
int a, b;
long long cap;
fin>>a>>b>>cap;
graph.add_edge(a,b,cap);
}
fout<<graph.Dinic(1,n);
return 0;
}