当前位置: 首页 > news >正文

呼吸

在网络流中我们要学会呼吸。。。

#include <bits/stdc++.h>
#define int long long
using namespace std;
constexpr int maxn = 1.2e3+10;
constexpr int maxm = 2.4e5+10;
constexpr int INF = 0x3f3f3f3f3f3f3f3f;int n,m,s,t;struct node
{int to,w,rev;// rev反向边编号node()=default;node(int a,int b,int c):to(a),w(b),rev(c){}
};vector<node> gra[maxn];
int gap[maxn],h[maxn],exf[maxn];
stack<int> b[maxn];
int h_max;void add(int u,int v,int c)
{gra[u].emplace_back(v,c,gra[v].size());gra[v].emplace_back(u,0,gra[u].size()-1);
}bool push(int u)
{bool init=(u==s);for(auto &i : gra[u]){int &v=i.to;int &w=i.w;int &rev=i.rev;// 没有剩余容量,高度差不为1,达不到t(init用)if(!w || (!init && h[u]!=h[v]+1) || h[v]==INF) continue;int k=init ? w : min(w,exf[u]);if(v!=s && v!=t && !exf[v])// 不是是s,t,可能有能力继续推{// 如果还有超额流,那一定不能往下推b[h[v]].emplace(v);// 对应高度的桶h_max=max(h_max,h[v]);// 记录最高高度}exf[u]-=k;// 调整超额流exf[v]+=k;w-=k;gra[v][rev].w+=k;if(!exf[u]) return 0;// 不溢出,不用relabel}return 1;
}bool bfs()
{memset(h,63,sizeof(int)*(n+3));queue<int> q;q.emplace(t);// 从t(h=0)开始h[t]=0;while(!q.empty()){int u=q.front(); q.pop();for(auto &i : gra[u]){int &v=i.to;int &rev=i.rev;if(gra[v][rev].w && h[v]>h[u]+1)// t->s的反向边(s->t)有余量{h[v]=h[u]+1;q.emplace(v);}}}return h[s]!=INF;// 判断能否到s
}int get_h_max()
{while(~h_max && b[h_max].empty()) --h_max;return ~h_max ? b[h_max].top() : 0;
}void relabel(int u)
{h[u]=INF;for(auto &i : gra[u]){if(i.w) h[u]=min(h[u],h[i.to]);// u高度升为最小邻居+1}++h[u];if(h[u]<n){// 维护一下高度相关的优化b[h[u]].emplace(u);h_max=max(h_max,h[u]);++gap[h[u]];}
}int hlpp()
{if(!bfs()) return 0;memset(gap,0,sizeof(int)*(n+10));//需要一点冗余因为会有部分设为n+1回流时h变高for(int i=1;i<=n;++i){if(h[i]!=INF) ++gap[h[i]];// 初始化gap}h[s]=n;push(s);// 初始化int u;while((u=get_h_max()))// 取出有超额流的h最高的点{b[h_max].pop();if(push(u)){// 仍然溢出,高度一定改变if(!--gap[h[u]])// 如果断层,所有在区间内的点都不可能到t{for(int i=1;i<=n;++i){if(i!=s && h[i]>h[u] && h[i]<n+1){h[i]=INF;}}}relabel(u);}}return exf[t];
}signed main()
{#ifndef ONLINE_JUDGEfreopen("cjdl.in","r",stdin);freopen("cjdl.out","w",stdout);#endifscanf("%lld%lld%lld%lld",&n,&m,&s,&t);for(int i=1,u,v,c; i<=m;++i){scanf("%lld%lld%lld",&u,&v,&c);add(u,v,c);}int ans=hlpp();printf("%lld\n",ans);return 0;
}
http://www.jsqmd.com/news/432612/

相关文章:

  • 省钱兄科技无人自助系统:智能算法驱动下的高效省钱新方案
  • 深度解析省钱兄科技:无人自助系统背后的省钱黑科技
  • 512G EMMC擦写时间比较长问题 - M
  • 你的听力,该好好保护了!这些护耳知识一定要知道!
  • Fastadmin中使用Redis
  • 国际爱耳日如何爱耳?在喧嚣的世界里,给耳朵带来一份“安静”的爱
  • 从工具到伙伴:深度解析AI智能体如何重塑传统行业格局
  • A Space
  • 2 月刊|GPM 2.0错误日志分析上线,PC端监测能力全维度突破
  • 2026全球圆锥粉料清理筛市场:原粮初清装备稳健增长与产业应用前景
  • 设备管理要点:易点易动助力企业数字化转型
  • 西门子Smart 200 PLC与Smart 700触摸屏实现的定长切割与跟随切割功能:稳定运...
  • 2026年军队文职选岗培训机构推荐:优秀口碑好的军队文职头部机构 - 野榜精选
  • 洛谷P1593 因子和 题解
  • AI Agent 完全指南:2026 年核心概念、主流框架、开发实践与选型建议
  • 植物大战僵尸杂交版下载:全网最详细的安装教程,手机电脑都能玩(附下载地址) - xiema
  • 【每天学习一点算法 2026/03/03】递增的三元子序列
  • 谭蔚泓院士高分文章汇总(2025-2026)
  • (开源项目)当我用Codex修复本科做的双创项目...研梦:基于Django+Vue的考研信息化平台(论坛发帖、新闻资讯、爬虫趋势)
  • 今年准备看AI方向的机会?这份《大模型与Agent面试宝典》建议收藏
  • 选择WMS仓储管理系统供应商时,需要考察哪些关键因素?
  • vue3中台框架解析
  • 2026年度无管道单向流新风系统品牌TOP10榜单:技术创新与场景适配性双维度评选 - 野榜精选
  • 2026年河北滚齿机厂家实力榜:六轴数控滚齿机、四轴数控滚齿机、五轴数控滚齿机、大型数控滚齿机、卧式滚齿机、大模数滚齿机、五家企业凭技术与口碑出圈 - 海棠依旧大
  • 智能体技能构建手册:让AI真正“动手“的模块化艺术
  • 初创企业如何构思创意域名
  • 没有哲学社会科学预印本平台,也没关系
  • Lumina-mGPT多模态模型解析(持续更新)[特殊字符][特殊字符]
  • 创客匠人的用户旅程重构:AI智能体如何编织知识变现的隐形价值链
  • Mask2Former图像分割ADE20k训练 Swin-Tiny模型详解 [特殊字符]