Pagini recente » Cod sursa (job #125243) | Cod sursa (job #523986) | Cod sursa (job #3246023) | Cod sursa (job #3264510) | Cod sursa (job #3259687)
#include <bits/stdc++.h>
using namespace std;
struct Dinic
{
struct Edge
{
int from, to, cap, last;
};
int n, inf = 1e9;
vector<Edge> edges;
vector<int> last, dist;
Dinic(int N)
{
n = N;
last.resize(n + 1, -1);
dist.resize(n + 1, -1);
}
void baga(int from, int to, int cap)
{
edges.push_back({from, to, cap, last[from]});
last[from] = edges.size() - 1;
edges.push_back({to, from, 0, last[to]});
last[to] = edges.size() - 1;
}
bool bfs(int source, int sink)
{
dist.assign(n + 1, inf);
queue<int> q;
dist[source] = 0;
q.push(source);
while(q.size())
{
auto x = q.front();
q.pop();
for(int i = last[x]; i != -1; i = edges[i].last)
{
if(edges[i].cap > 0 && dist[edges[i].to] == inf)
{
q.push(edges[i].to);
dist[edges[i].to] = dist[edges[i].from] + 1;
}
}
}
return dist[sink] != inf;
}
int dfs(int nod, int sink, int push)
{
if(push == 0)
return 0;
if(nod == sink)
return push;
int newPush = 0;
for(int i = last[nod]; i != -1; i = edges[i].last)
{
if(edges[i].cap == 0 || dist[edges[i].to] != 1 + dist[nod])
continue;
auto x = dfs(edges[i].to, sink, min(edges[i].cap, push - newPush));
edges[i].cap -= x;
edges[i ^ 1].cap += x;
newPush += x;
}
return newPush;
}
int maxFlow(int source, int sink)
{
int ans = 0;
while(bfs(source, sink))
{
int x = 1;
while(x)
{
x = dfs(source, sink, inf);
ans += x;
}
}
return ans;
}
};
signed main()
{
ifstream cin("maxflow.in");
ofstream cout("maxflow.out");
int n, m;
cin >> n >> m;
Dinic ds(n);
for(int i = 1; i <= m; i ++)
{
int u, v, w;
cin >> u >> v >> w;
ds.baga(u, v, w);
}
cout << ds.maxFlow(1, n);
}