bzoj1066

本文详细介绍了裸最大流算法的实现细节,包括关键的数据结构定义、边的添加过程及核心的增广路径寻找方法。通过具体示例展示了如何利用裸最大流解决实际问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

练了这么久,应该就成了裸的最大流了吧

不1Y对不起自己

  1 const inf=1000007;
  2 type node=record
  3        next,point,flow:longint;
  4      end;
  5 
  6 var edge:array[0..200010] of node;
  7     a:array[0..30,0..30] of longint;
  8     p,x,y,numh,h,cur,pre,f:array[0..1010] of longint;
  9     len,ans,sum,t,tot,i,j,n,m,d:longint;
 10     c:char;
 11 
 12 function min(a,b:longint):longint;
 13   begin
 14     if a>b then exit(b) else exit(a);
 15   end;
 16 
 17 procedure add(x,y,f:longint);
 18   begin
 19     inc(len);
 20     edge[len].point:=y;
 21     edge[len].flow:=f;
 22     edge[len].next:=p[x];
 23     p[x]:=len;
 24   end;
 25 
 26 procedure sap;
 27   var u,q,i,j,tmp,neck:longint;
 28   begin
 29     u:=0;
 30     numh[0]:=tot+1;
 31     while h[0]<tot+1 do
 32     begin
 33       if u=tot then
 34       begin
 35         i:=0;
 36         while i<>tot do
 37         begin
 38           j:=cur[i];
 39           dec(edge[j].flow);
 40           inc(edge[j xor 1].flow);
 41           i:=edge[j].point;
 42         end;
 43         u:=0;
 44         inc(ans);
 45       end;
 46       q:=-1;
 47       i:=p[u];
 48       while i<>-1 do
 49       begin
 50         j:=edge[i].point;
 51         if (edge[i].flow>0) and (h[u]=h[j]+1) then
 52         begin
 53           q:=i;
 54           break;
 55         end;
 56         i:=edge[i].next;
 57       end;
 58       if q<>-1 then
 59       begin
 60         cur[u]:=q;
 61         pre[j]:=u;
 62         u:=j;
 63       end
 64       else begin
 65         dec(numh[h[u]]);
 66         if numh[h[u]]=0 then exit;
 67         tmp:=tot+1;
 68         i:=p[u];
 69         while i<>-1 do
 70         begin
 71           j:=edge[i].point;
 72           if edge[i].flow>0 then tmp:=min(tmp,h[j]);
 73           i:=edge[i].next;
 74         end;
 75         h[u]:=tmp+1;
 76         inc(numh[h[u]]);
 77         if u<>0 then u:=pre[u];
 78       end;
 79     end;
 80   end;
 81 
 82 begin
 83   readln(n,m,d);
 84   len:=-1;
 85   fillchar(p,sizeof(p),255);
 86   for i:=1 to n do
 87   begin
 88     for j:=1 to m do
 89     begin
 90       read(c);
 91       if c<>'0' then
 92       begin
 93         inc(t);
 94         f[t]:=ord(c)-48;
 95         x[t]:=i;
 96         y[t]:=j;
 97         a[i,j]:=t;
 98       end;
 99     end;
100     readln;
101   end;
102   for i:=1 to n do
103   begin
104     for j:=1 to m do
105     begin
106       read(c);
107       if c='L' then
108       begin
109         inc(sum);
110         add(0,a[i,j],1);
111         add(a[i,j],0,0);
112       end;
113     end;
114     readln;
115   end;
116   tot:=t shl 1+1;
117   for i:=1 to t do
118   begin
119     for j:=i+1 to t do
120       if d*d>=sqr(x[i]-x[j])+sqr(y[i]-y[j]) then
121       begin
122         add(i+t,j,inf);
123         add(j,i+t,0);
124         add(j+t,i,inf);
125         add(i,j+t,0);
126       end;
127     if (x[i]+d>n) or (x[i]-d<=0) or (y[i]+d>m) or (y[i]-d<=0) then
128     begin
129       add(i+t,tot,inf);
130       add(tot,i+t,0);
131     end;
132     add(i,i+t,f[i]);
133     add(i+t,i,0);
134   end;
135   sap;
136   writeln(sum-ans);
137 end.
View Code

 

转载于:https://www.cnblogs.com/phile/p/4473248.html

### 数位DP算法的学习资源 数位DP是一种用于解决特定范围内的数字统计问题的动态规划方法。它通过逐位分析数字特性来优化计算效率,适用于许多复杂场景中的计数问题。 以下是针对数位DP算法推荐的相关视频教程和学习资料: #### 推荐视频教程 1. **灵神的数位DP通用模板讲解** 灵神提供了详细的数位DP教学视频,涵盖了从基础到高级的应用案例,并附带了多种编程语言实现的代码示例[^1]。该课程适合初学者快速掌握核心概念并应用于实际解题。 2. **数据结构与算法一年刷题特训营 - 数位DP模块** 特训营中的第20部分专门讨论了不同类型的动态规划问题,其中章节 `20.7 数位DP` 提供了深入浅出的教学内容以及配套练习题解析[^4]。此资源非常适合希望系统化提升技能的学习者。 #### 推荐学习资料 1. **LeetCode官方文档及相关题目列表** LeetCode上的难度较高的题目如“统计特殊整数”(No. 2376),“至少有1位重复的数字”(No. 1012)等均涉及数位DP的思想[^1]。这些题目不仅帮助理解理论知识,还能锻炼实战能力。 2. **OI竞赛经典题目集合** OI社区贡献了许多经典的数位DP训练题,例如【Luogu1066】2^k 进制数、【Bzoj1026】Windy数等问题[^3]。这些问题覆盖了各种变体情况下的应用技巧,有助于全面巩固知识点。 3. **今日做题家 - 面试算法题教程系列** 此项目包含了丰富的算法主题介绍及其应用场景说明,虽然是面向面试准备设计的内容,但对于想要深入了解某一领域技术细节的人群同样具有很高的参考价值[^2]。 ```python # 示例代码片段展示如何初始化状态转移方程 (基于 Python 实现) def digit_dp(n, condition_func): s = str(n) @cache def f(i, is_limit, state): if i == len(s): return int(condition_func(state)) res = 0 up = int(s[i]) if is_limit else 9 for d in range(up + 1): next_state = update_state(d, state) res += f(i+1, is_limit and d==up, next_state) return res return f(0,True,initial_state()) ``` 以上即为关于数位DP算法的部分优质视频教程及学习材料汇总信息。建议根据个人需求选取合适的方式展开进一步探索实践。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值