- 个人训练情况
Stat | # | Title | |
---|---|---|---|
Solved | 8 / 14 | A | The Perfect Stall |
Solved | 3 / 5 | B | March of the Penguins |
1 / 1 | C | PIGS | |
0 / 4 | D | Sightseeing tour | |
E | Budget | ||
0 / 2 | F | Optimal Milking | |
G | Firing | ||
H | Shoot the Bullet |
- 遇到的问题&解决方法
第一题“The Perfect Stall”二分匹配借用最大流EK算法解决:先设置源点和汇点,连接源点和所有牛,连接汇点和所有牛棚。再利用bfs寻找从源点到汇点的路径(增广路)要求每条边残余值>0,找出一条增广路后再在每条边正向上增加残余值的最小值,反向上减去残余值的最小值,sum加上残余值的最小值,完成一次增广。反复增广直到bfs找不到一条源点到汇点的路径时的sum就是答案。遇到的问题&解决方法
第二题“March of the Penguins”使用dinic算法:将每个点拆成入点(从1到n编号)和出点(从n+1到2n编号)两个点,权值为每个点的最大跳跃次数,建立源点(编号为0)并将源点与每个入点相连,权值为每个点上的企鹅数,尝试将每个点的出点与另一个点的入点相连(若两点间距离小于最大跳跃距离则相连),再分别把每个点(除源点外)的入点作为汇点,利用dinic算法求最大流:
1.利用bfs建立层次图,表示每个残余流量大于0的点到源点的最短距离(每条边距离为1).
2.利用dfs多路增广,flow=每次增广的值累加.
3.重复1和2直到bfs无法建立层次图时的flow即为最大流。
若flow与企鹅总数相等,则该汇点有效,依次遍历所有点找出所有可行的汇点。