[洛谷 P3376] 网络最大流 | 模板 (Dinic算法) 入门

简介: 题目描述如题,给出一个网络图,以及其源点和汇点,求出其网络最大流。输入格式第一行包含四个正整数 n nn,m mm,s ss,t tt,分别表示点的个数、有向边的个数、源点序号、汇点序号。接下来M行每行包含三个正整数 ui ,vi,wi ,表示第 i 条有向边从 ui 出发,到达 vi,边权为 wi即该边最大流量为 wi)。输出格式一行,包含一个正整数,即为该网络的最大流。

题目链接


题目描述


如题,给出一个网络图,以及其源点和汇点,求出其网络最大流。


输入格式


第一行包含四个正整数 n nn,m mm,s ss,t tt,分别表示点的个数、有向边的个数、源点序号、汇点序号。


接下来M行每行包含三个正整数 ui ,vi,wi ,表示第 i 条有向边从 ui 出发,到达 vi,边权为 wi即该边最大流量为 wi)。


输出格式


一行,包含一个正整数,即为该网络的最大流。


输入输出样例


4 5 4 3
4 2 30
4 3 20
2 3 20
2 1 30
1 3 40
50


样例输入输出 1 解释


80e888d89c2a411c9826d78ae5af2112.png

b2af0b70a4f244cba727e057f5c6d871.png


层次图:


假设在残量网络中,起点到结点u的距离为dist(u) ,我们把dist(u)看作是结点u的的层次。只保留每个点出发到下一个层次的弧,得到的图就叫做层次图,层次图上的任意路径都是“起点-> 层次1-> 层次2-> …"这样的顺序,不难发现,每条这样的路径都是s->t 的最段路


阻塞流:


阻塞流实际上就是指不考虑反向弧时的”极大流“,对应到程序里就是从起点开始在层次图中DFS,没找到一条路就进行增广

多次增广之后层次图中不存在s->t的路径,合称阻塞流

Dinic 最多会进行计算n-1 次阻塞流(每次沿阻塞流增广之后,最大距离至少会增加1),而每次阻塞流的计算时间均不超过O ( m n ) O(mn)O(mn) ,实际上比这个理论界好的多


从宏观上讲,Dinic算法就是不停地用BFS来进行构造层次图,然后用阻塞流来增广。

struct Edge {
    int u, v;
    ll cap, flow;
    Edge(int _u, int _v, ll _cap, ll _flow) {
        u = _u, v = _v;
        cap = _cap, flow = _flow;
    }
};
struct Dinic {
    vector<Edge> edge;
    vector<int> G[maxn];
    ll dis[maxn],cur[maxn];
    int n,s,t;
    bool vis[maxn];
    void init(int x,int _s,int _t){
      n = x;
      for(int i = 0;i <= n;i++) G[i].clear();
      s = _s,t = _t;
      edge.clear();
    }
    void add(int u,int v,ll cap){
      edge.push_back(Edge(u,v,cap,0));
      edge.push_back(Edge(v,u,0,0));
      G[u].push_back(edge.size() - 2);
      G[v].push_back(edge.size() - 1);
    }
    bool bfs(int s,int t){
      queue<int> que;
      memset(vis,0,sizeof vis);
      // memset(dis,0,sizeof dis);
      dis[s] = 0;
      que.push(s);
      vis[s] = 1;
      while(que.size()){
        int u = que.front();
        que.pop();
        for(int i=0;i<G[u].size();i++){
          int id = G[u][i];
          int to = edge[id].v;
          if(!vis[to] && edge[id].cap > edge[id].flow){
            dis[to] = dis[u] + 1;
            que.push(to);
            vis[to] = 1;
          }
        }
      }
      return vis[t];
    }
    ll dfs(int s,int t,ll rest){
      if(s == t || rest == 0) return rest;
      ll sum = 0LL;
      ll Flow = 0, f;
      for(ll& i = cur[s];i < G[s].size();i ++){
        Edge& e = edge[G[s][i]];
        if(dis[s] + 1 == dis[e.v] && (f = dfs(e.v ,t,min(rest,e.cap - e.flow))) > 0){
          e.flow += f;
          edge[G[s][i] ^ 1].flow -= f;
          Flow += f;
          rest -= f;
          if(rest == 0) break;
        }
      }
      return Flow;
    }
    ll getMaxFlow(int s,int t){
      ll ans = 0;
      while(bfs(s,t)) {
        memset(cur,0,sizeof cur);
        ans += dfs(s,t,0x3f3f3f3f);
      }
      return ans;
    }
} solve;
int main() {
    int n = read,m = read,s = read,t = read;
    solve.init(n,s,t);
    for(int i=1;i<=m;i++){
      ll u = read,v = read,cap = read;
      solve.add(u,v,cap);
    }
    cout << solve.getMaxFlow(s,t) <<endl;
    return 0;
}




目录
相关文章
|
3天前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的眼疾识别系统实现~人工智能+卷积网络算法
眼疾识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了4种常见的眼疾图像数据集(白内障、糖尿病性视网膜病变、青光眼和正常眼睛) 再使用通过搭建的算法模型对数据集进行训练得到一个识别精度较高的模型,然后保存为为本地h5格式文件。最后使用Django框架搭建了一个Web网页平台可视化操作界面,实现用户上传一张眼疾图片识别其名称。
20 4
基于Python深度学习的眼疾识别系统实现~人工智能+卷积网络算法
|
25天前
|
机器学习/深度学习 人工智能 算法
猫狗宠物识别系统Python+TensorFlow+人工智能+深度学习+卷积网络算法
宠物识别系统使用Python和TensorFlow搭建卷积神经网络,基于37种常见猫狗数据集训练高精度模型,并保存为h5格式。通过Django框架搭建Web平台,用户上传宠物图片即可识别其名称,提供便捷的宠物识别服务。
245 55
|
16天前
|
机器学习/深度学习 算法
基于改进遗传优化的BP神经网络金融序列预测算法matlab仿真
本项目基于改进遗传优化的BP神经网络进行金融序列预测,使用MATLAB2022A实现。通过对比BP神经网络、遗传优化BP神经网络及改进遗传优化BP神经网络,展示了三者的误差和预测曲线差异。核心程序结合遗传算法(GA)与BP神经网络,利用GA优化BP网络的初始权重和阈值,提高预测精度。GA通过选择、交叉、变异操作迭代优化,防止局部收敛,增强模型对金融市场复杂性和不确定性的适应能力。
151 80
|
4天前
|
机器学习/深度学习 数据采集 算法
基于GA遗传优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
本项目基于MATLAB2022a实现时间序列预测,采用CNN-GRU-SAM网络结构。卷积层提取局部特征,GRU层处理长期依赖,自注意力机制捕捉全局特征。完整代码含中文注释和操作视频,运行效果无水印展示。算法通过数据归一化、种群初始化、适应度计算、个体更新等步骤优化网络参数,最终输出预测结果。适用于金融市场、气象预报等领域。
基于GA遗传优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
|
1月前
|
机器学习/深度学习 人工智能 算法
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
宠物识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了37种常见的猫狗宠物种类数据集【'阿比西尼亚猫(Abyssinian)', '孟加拉猫(Bengal)', '暹罗猫(Birman)', '孟买猫(Bombay)', '英国短毛猫(British Shorthair)', '埃及猫(Egyptian Mau)', '缅因猫(Maine Coon)', '波斯猫(Persian)', '布偶猫(Ragdoll)', '俄罗斯蓝猫(Russian Blue)', '暹罗猫(Siamese)', '斯芬克斯猫(Sphynx)', '美国斗牛犬
172 29
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
|
3天前
|
存储 监控 算法
局域网网络管控里 Node.js 红黑树算法的绝妙运用
在数字化办公中,局域网网络管控至关重要。红黑树作为一种自平衡二叉搜索树,凭借其高效的数据管理和平衡机制,在局域网设备状态管理中大放异彩。通过Node.js实现红黑树算法,可快速插入、查找和更新设备信息(如IP地址、带宽等),确保网络管理员实时监控和优化网络资源,提升局域网的稳定性和安全性。未来,随着技术融合,红黑树将在网络管控中持续进化,助力构建高效、安全的局域网络生态。
24 9
|
9天前
|
机器学习/深度学习 算法
基于遗传优化的双BP神经网络金融序列预测算法matlab仿真
本项目基于遗传优化的双BP神经网络实现金融序列预测,使用MATLAB2022A进行仿真。算法通过两个初始学习率不同的BP神经网络(e1, e2)协同工作,结合遗传算法优化,提高预测精度。实验展示了三个算法的误差对比结果,验证了该方法的有效性。
|
12天前
|
机器学习/深度学习 数据采集 算法
基于PSO粒子群优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
本项目展示了基于PSO优化的CNN-GRU-SAM网络在时间序列预测中的应用。算法通过卷积层、GRU层、自注意力机制层提取特征,结合粒子群优化提升预测准确性。完整程序运行效果无水印,提供Matlab2022a版本代码,含详细中文注释和操作视频。适用于金融市场、气象预报等领域,有效处理非线性数据,提高预测稳定性和效率。
|
10天前
|
算法 网络协议 Python
探秘Win11共享文件夹之Python网络通信算法实现
本文探讨了Win11共享文件夹背后的网络通信算法,重点介绍基于TCP的文件传输机制,并提供Python代码示例。Win11共享文件夹利用SMB协议实现局域网内的文件共享,通过TCP协议确保文件传输的完整性和可靠性。服务器端监听客户端连接请求,接收文件请求并分块发送文件内容;客户端则连接服务器、接收数据并保存为本地文件。文中通过Python代码详细展示了这一过程,帮助读者理解并优化文件共享系统。
|
1月前
|
机器学习/深度学习 人工智能 算法
深入解析图神经网络:Graph Transformer的算法基础与工程实践
Graph Transformer是一种结合了Transformer自注意力机制与图神经网络(GNNs)特点的神经网络模型,专为处理图结构数据而设计。它通过改进的数据表示方法、自注意力机制、拉普拉斯位置编码、消息传递与聚合机制等核心技术,实现了对图中节点间关系信息的高效处理及长程依赖关系的捕捉,显著提升了图相关任务的性能。本文详细解析了Graph Transformer的技术原理、实现细节及应用场景,并通过图书推荐系统的实例,展示了其在实际问题解决中的强大能力。
178 30
下一篇
开通oss服务