Dinic 算法
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 const int N (1e5+5), M(1e5+5); 5 6 int head[N]; 7 struct Edge{ 8 /* 9 r: residual capacity 10 */ 11 int v, r, nt; 12 }E[M]; 13 int tail; 14 void add_edge(int u, int v, int c){ 15 E[tail]={v, c, head[u]}, head[u]=tail++; 16 E[tail]={u, 0, head[v]}, head[v]=tail++; 17 } 18 19 int level[N]; 20 void bfs(int s){ 21 memset(level, -1, sizeof(level)); 22 queue<int> que; 23 level[s]=0; 24 que.push(s); 25 for(int u; !que.empty(); ){ 26 u=que.front(), que.pop(); 27 for(int i=head[u]; ~i; i=E[i].nt){ 28 int &v=E[i].v; 29 if(E[i].r>0 && level[v]<0){ 30 level[v]=level[u]+1; 31 que.push(v); 32 } 33 } 34 } 35 } 36 37 int iter[N]; 38 int dfs(int u, int t, int f){ 39 /* 40 t: terminal (sink) 41 */ 42 if(u==t) return f; 43 //for(int &i=iter[u]; i!=-1; i++){ 44 for(int &i=iter[u]; i!=-1; i=E[i].nt){ 45 int &v=E[i].v, &r=E[i].r; 46 if(r>0 && level[u]<level[v]){ 47 int d=dfs(v, t, min(f, r)); 48 if(d>0){ 49 r-=d; 50 E[i^1].r+=d; 51 return d; 52 } 53 } 54 } 55 return 0; 56 } 57 58 int dinic(int s, int t){ 59 const int INF=1<<30; 60 for(int flow=0;;){ 61 bfs(s); 62 if(level[t]<0) return flow; 63 memcpy(iter, head, sizeof(iter)); 64 for(int f; f=dfs(s, t, INF); flow+=f); 65 } 66 } 67 68 void init(){ 69 tail=0; 70 memset(head, -1, sizeof(head)); 71 }
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· C# 13 中的新增功能实操
· Ollama本地部署大模型总结
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(4)
· langchain0.3教程:从0到1打造一个智能聊天机器人
· 2025成都.NET开发者Connect圆满结束