https://ac.nowcoder.com/acm/contest/878/B

这个题目是一个网络流,但是建图却没有那么好建,首先我们都会把每一个人与源点相连,每一个洞口和汇点相连。

然后人和洞口相连,这个是基本思路,但是呢,这个题目因为限制了出洞口的人数,所以这个时候要将每一个洞口的每一个时刻和下一个时刻相连。

所以这个题目的建图,人和源点相连,容量为1,费用为0,人与同一时刻的洞口相连,容量为1,费用为他们之间的距离,

每一个洞口和下一时刻的这个洞口相连,容易为inf,费用为1,每一个洞口和汇点相连,容量为1,费用为0.

这个需要注意的地方:

1.人与同一时刻的洞口相连

2.就是注意这个时间最长,最长应该是n+m+k,因为一个人走到一个地方的最远距离是n+m,然后又有k个人

这个确实很难考虑,我还没有想的很清楚。

  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <cstring>
  4. #include <queue>
  5. #include <iostream>
  6. #include <vector>
  7. #include <algorithm>
  8. #define inf 0x3f3f3f3f
  9. using namespace std;
  10. typedef long long ll;
  11. const int INF = 0x3f3f3f3f;
  12. const int maxn = 1e5+;
  13. struct edge
  14. {
  15. int u, v, c, f, cost;
  16. edge(int u, int v, int c, int f, int cost) :u(u), v(v), c(c), f(f), cost(cost) {}
  17. };
  18. vector<edge>e;
  19. vector<int>G[maxn];
  20. int a[maxn];//找增广路每个点的水流量
  21. int p[maxn];//每次找增广路反向记录路径
  22. int d[maxn];//SPFA算法的最短路
  23. int inq[maxn];//SPFA算法是否在队列中
  24. void init(int n)
  25. {
  26. for (int i = ; i <= n; i++)G[i].clear();
  27. e.clear();
  28. }
  29. void addedge(int u, int v, int c, int cost)
  30. {
  31. e.push_back(edge(u, v, c, , cost));
  32. e.push_back(edge(v, u, , , -cost));
  33. int m = e.size();
  34. G[u].push_back(m - );
  35. G[v].push_back(m - );
  36. }
  37. bool bellman(int s, int t, int& flow, long long & cost)
  38. {
  39. memset(d, inf, sizeof(d));
  40. memset(inq, , sizeof(inq));
  41. d[s] = ; inq[s] = ;//源点s的距离设为0,标记入队
  42. p[s] = ; a[s] = INF;//源点流量为INF(和之前的最大流算法是一样的)
  43.  
  44. queue<int>q;//Bellman算法和增广路算法同步进行,沿着最短路拓展增广路,得出的解一定是最小费用最大流
  45. q.push(s);
  46. while (!q.empty())
  47. {
  48. int u = q.front();
  49. q.pop();
  50. inq[u] = ;//入队列标记删除
  51. for (int i = ; i < G[u].size(); i++)
  52. {
  53. edge & now = e[G[u][i]];
  54. int v = now.v;
  55. if (now.c > now.f && d[v] > d[u] + now.cost)
  56. //now.c > now.f表示这条路还未流满(和最大流一样)
  57. //d[v] > d[u] + e.cost Bellman 算法中边的松弛
  58. {
  59. d[v] = d[u] + now.cost;//Bellman 算法边的松弛
  60. p[v] = G[u][i];//反向记录边的编号
  61. a[v] = min(a[u], now.c - now.f);//到达v点的水量取决于边剩余的容量和u点的水量
  62. if (!inq[v]) { q.push(v); inq[v] = ; }//Bellman 算法入队
  63. }
  64. }
  65. }
  66. if (d[t] == INF)return false;//找不到增广路
  67. flow += a[t];//最大流的值,此函数引用flow这个值,最后可以直接求出flow
  68. cost += (long long)d[t] * (long long)a[t];//距离乘上到达汇点的流量就是费用
  69. for (int u = t; u != s; u = e[p[u]].u)//逆向存边
  70. {
  71. e[p[u]].f += a[t];//正向边加上流量
  72. e[p[u] ^ ].f -= a[t];//反向边减去流量 (和增广路算法一样)
  73. }
  74. return true;
  75. }
  76. int MincostMaxflow(int s, int t, long long & cost)
  77. {
  78. cost = ;
  79. int flow = ;
  80. while (bellman(s, t, flow, cost));//由于Bellman函数用的是引用,所以只要一直调用就可以求出flow和cost
  81. return flow;//返回最大流,cost引用可以直接返回最小费用
  82. }
  83. char mp[][];
  84. int pos[][];
  85. int main()
  86. {
  87. int n, m, k, cnt = ;
  88. scanf("%d %d %d", &n, &m, &k);
  89. for (int i = ; i <= n; i++)
  90. {
  91. scanf("%s", mp[i] + );
  92. for (int j = ; j <= m; j++)
  93. {
  94. if (mp[i][j] == '')
  95. {
  96. pos[++cnt][] = i;
  97. pos[cnt][] = j;
  98. }
  99. }
  100. }
  101. int sum = n + m + k;
  102. int s = , t = k + cnt * sum + ;
  103. for (int i = ; i <= cnt; i++)
  104. {
  105. for (int j = ; j <= sum; j++)
  106. {
  107. int tmp = k + (i - )*sum + j;
  108. addedge(tmp, t, , );
  109. if (j != sum) addedge(tmp, tmp + , inf, );
  110. }
  111. }
  112. for (int i = ; i <= k; i++)
  113. {
  114. int x, y, w;
  115. scanf("%d%d%d", &x, &y, &w);
  116. addedge(s, i, , );
  117. for (int j = ; j <= cnt; j++)
  118. {
  119. int dis = abs(pos[j][] - x) + abs(pos[j][] - y);
  120. addedge(i, k + (j - )*sum + dis, , dis);
  121. }
  122. }
  123. ll cost = ;
  124. int ans = MincostMaxflow(s, t, cost);
  125. printf("%lld\n", cost);
  126. return ;
  127. }

2019国防科大校赛 B Escape LouvreⅡ的更多相关文章

  1. 2019浙师大校赛(浙大命题)(upc复现赛)总结

    2019浙师大校赛(浙大命题)(upc复现赛)总结 早上九点开始.起得迟了,吃了早饭慌慌张张跑过去,刚到比赛就开始了. 开始分别从前往后和从后往前看题,一开始A题,第一发WA,第二次读题发现漏看了还有 ...

  2. 2019 ICPC 南昌网络赛

    2019 ICPC 南昌网络赛 比赛时间:2019.9.8 比赛链接:The 2019 Asia Nanchang First Round Online Programming Contest 总结 ...

  3. 2019~2020icpc亚洲区域赛徐州站H. Yuuki and a problem

    2019~2020icpc亚洲区域赛徐州站H. Yuuki and a problem 题意: 给定一个长度为\(n\)的序列,有两种操作: 1:单点修改. 2:查询区间\([L,R]\)范围内所有子 ...

  4. 2019 ICPC 上海区域赛总结

    2019上海区域赛现场赛总结 补题情况(以下通过率为牛客提交): 题号 标题 已通过代码 通过率 我的状态 A Mr. Panda and Dominoes 点击查看 5/29 未通过 B Prefi ...

  5. 计蒜客 41391.query-二维偏序+树状数组(预处理出来满足情况的gcd) (The Preliminary Contest for ICPC Asia Xuzhou 2019 I.) 2019年徐州网络赛)

    query Given a permutation pp of length nn, you are asked to answer mm queries, each query can be rep ...

  6. 2017河工大校赛补题CGH and 赛后小结

    网页设计课上实在无聊,便开始补题,发现比赛时候僵着的东西突然相通了不少 首先,"追妹"这题,两个队友讨论半天,分好多种情况最后放弃(可是我连题目都没看啊),今天看了之后试试是不是直 ...

  7. 2019 蓝桥杯省赛 A 组模拟赛(一)-修建公路

    题目: 蒜头国有 nn 座城市,编号分别为 0,1,2,3,...,n-1.编号为 x 和 y 的两座城市之间如果要修高速公路,必须花费 x|y 个金币,其中|表示二进制按位或. 吝啬的国王想要花最少 ...

  8. POJ-2796 & 2019南昌邀请赛网络赛 I. 区间最大min*sum

    http://poj.org/problem?id=2796 https://nanti.jisuanke.com/t/38228 背景 给定一个序列,对于任意区间,min表示区间中最小的数,sum表 ...

  9. squee_spoon and his Cube VI---郑大校赛(求最长子串)

    市面上最常见的魔方,是三阶魔方,英文名为Rubik's Cube,以魔方的发明者鲁比克教授的名字命名.另外,二阶魔方叫Pocket Cube,它只有2*2*2个角块,通常也就比较小:四阶魔方叫Reve ...

随机推荐

  1. B. 复读机的力量

    我们规定一个人是复读机当且仅当他说的每一句话都是复读前一个人说的话. 我们规定一个人是复读机当且仅当他说的每一句话都是复读前一个人说的话. 我们规定一个人是复读机当且仅当他说的每一句话都是复读前一个人 ...

  2. Rank of Tetris 杭电 拓扑排序加并查集

    自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球. 为了更好的符合那些爱好者的喜好,Lele又想了一个新点子:他将制作一个全球Tetris高手排行榜, ...

  3. SpringBoot系列(九)单,多文件上传的正确姿势

    SpringBoot系列(九)分分钟解决文件上传 往期推荐 SpringBoot系列(一)idea新建Springboot项目 SpringBoot系列(二)入门知识 springBoot系列(三)配 ...

  4. layui table渲染和数据处理

    最近在用layui开发管理系统,果然是"累"ui 实现功能:将之前选择的选项勾选,渲染备注信息(原数据为空的列) <table class="layui-hide& ...

  5. react: typescript jest && enzyme

    Install Jest 1.install jest dependencies jest @types/jest ts-jest -D 2.jest.config.js module.exports ...

  6. Java中Character类

    Character 类在对象中包装一个基本类型char的值此外,该类提供了几种方法,以确定字符的类别(小写字母,数字,等),并将字符从大写转小写,反之亦然. 构造方法: Character(char ...

  7. python进入adb shell交互模式

    import subprocess #方法一:进入某个环境执行语句(adb shell),注意shell内部命令需要带\n,执行完后一定记得执行exit命令退出,否则会阻塞 obj = subproc ...

  8. Asp.Net Core 3.1 学习3、Web Api 中基于JWT的token验证及Swagger使用

    1.初始JWT 1.1.JWT原理 JWT(JSON Web Token)是目前最流行的跨域身份验证解决方案,他的优势就在于服务器不用存token便于分布式开发,给APP提供数据用于前后端分离的项目. ...

  9. python正则表达式详解之Match类及其方法

    1.Match对象简介 match对象通常是由正则表达式对象的match 方法,search 方法等经过匹配之后而产生.可以直接当做bool值使用,如果匹配则相当于True, 如果不匹配,则返回Non ...

  10. c语言 字符串大小写转换

    https://www.programmingsimplified.com/c/program/c-program-change-case https://docs.microsoft.com/en- ...