很久以前,看到家乡洪水肆虐,大禹决心要把洪水引到大海里,因此带领众人修建立了一套水沟系统。他们在每条水沟都装了阀门来控制水的流量。他们设计了每条水沟每分钟的排水量,以及水沟的整体布局。洪水从池塘流出,最后汇入大海。请确定洪水从家乡流入大海的最大流量。 输入格式: 第一行包含两个整数N和M,分别表示水沟数量和水沟的交叉点数量,其中交叉点1代表家乡,交叉点M是大海。后面N行,每行三个整数,s,e,c,其中s,e表示交叉点且水从s流向e,最大流量是c(0到10000之间)。 输出格式: 输出排出水的最大流量。C/C++解决
时间: 2024-04-03 07:33:20 浏览: 67
以下是C++的代码实现,使用Edmonds-Karp算法:
```c++
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
const int N = 510, M = 200010;
int n, m;
int h[N], e[M], f[M], ne[M], idx;
int d[N], q[N], cur[N];
void add(int a, int b, int c)
{
e[idx] = b, f[idx] = c, ne[idx] = h[a], h[a] = idx ++ ;
e[idx] = a, f[idx] = 0, ne[idx] = h[b], h[b] = idx ++ ;
}
bool bfs(int s, int t)
{
memset(d, -1, sizeof d);
int hh = 0, tt = 0;
q[0] = s, d[s] = 0, cur[s] = h[s];
while (hh <= tt)
{
int t = q[hh ++ ];
for (int i = h[t]; ~i; i = ne[i])
{
int ver = e[i];
if (d[ver] == -1 && f[i])
{
d[ver] = d[t] + 1;
cur[ver] = h[ver];
if (ver == t) return true;
q[ ++ tt] = ver;
}
}
}
return false;
}
int find(int u, int limit, int t)
{
if (u == t) return limit;
int flow = 0;
for (int i = cur[u]; ~i && flow < limit; i = ne[i])
{
cur[u] = i;
int ver = e[i];
if (d[ver] == d[u] + 1 && f[i])
{
int t = find(ver, min(f[i], limit - flow), t);
if (!t) d[ver] = -1;
f[i] -= t, f[i ^ 1] += t, flow += t;
}
}
return flow;
}
int dinic(int s, int t)
{
int r = 0, flow;
while (bfs(s, t)) while (flow = find(s, 0x3f3f3f3f, t)) r += flow;
return r;
}
int main()
{
memset(h, -1, sizeof h);
cin >> n >> m;
while (m -- )
{
int a, b, c;
cin >> a >> b >> c;
add(a, b, c);
}
cout << dinic(1, n) << endl;
return 0;
}
```
时间复杂度为O(nm^2),其中n为节点数量,m为边数量。
阅读全文