题意:自己看题目,中文体面。

题解:

把所有不能走的路径放入AC自动机中。

然后DP【i】【j】表示走到 i 这个点,且位于AC自动机 j 这个节点最短距离

然后直接DP即可。注意一点会爆int

  1. #include <set>
  2. #include <map>
  3. #include <stack>
  4. #include <queue>
  5. #include <cmath>
  6. #include <ctime>
  7. #include <cstdio>
  8. #include <string>
  9. #include <vector>
  10. #include <cstring>
  11. #include <iostream>
  12. #include <algorithm>
  13. #include <unordered_map>
  14.  
  15. #define pi acos(-1.0)
  16. #define eps 1e-9
  17. #define fi first
  18. #define se second
  19. #define rtl rt<<1
  20. #define rtr rt<<1|1
  21. #define bug printf("******\n")
  22. #define mem(a, b) memset(a,b,sizeof(a))
  23. #define name2str(x) #x
  24. #define fuck(x) cout<<#x" = "<<x<<endl
  25. #define sfi(a) scanf("%d", &a)
  26. #define sffi(a, b) scanf("%d %d", &a, &b)
  27. #define sfffi(a, b, c) scanf("%d %d %d", &a, &b, &c)
  28. #define sffffi(a, b, c, d) scanf("%d %d %d %d", &a, &b, &c, &d)
  29. #define sfL(a) scanf("%lld", &a)
  30. #define sffL(a, b) scanf("%lld %lld", &a, &b)
  31. #define sfffL(a, b, c) scanf("%lld %lld %lld", &a, &b, &c)
  32. #define sffffL(a, b, c, d) scanf("%lld %lld %lld %lld", &a, &b, &c, &d)
  33. #define sfs(a) scanf("%s", a)
  34. #define sffs(a, b) scanf("%s %s", a, b)
  35. #define sfffs(a, b, c) scanf("%s %s %s", a, b, c)
  36. #define sffffs(a, b, c, d) scanf("%s %s %s %s", a, b,c, d)
  37. #define FIN freopen("../in.txt","r",stdin)
  38. #define gcd(a, b) __gcd(a,b)
  39. #define lowbit(x) x&-x
  40. #define IO iOS::sync_with_stdio(false)
  41.  
  42. using namespace std;
  43. typedef long long LL;
  44. typedef unsigned long long ULL;
  45. const ULL seed = ;
  46. const LL INFLL = 0x3f3f3f3f3f3f3f3fLL;
  47. const int maxn = 1e6 + ;
  48. const int maxm = 8e6 + ;
  49. const int INF = 0x3f3f3f3f;
  50. const int mod = 1e9 + ;
  51. int n, m, k, x[maxn], y[maxn], buf[];
  52.  
  53. double cal(int id1, int id2) {
  54. return sqrt((1.0 * x[id1] - x[id2]) * (1.0 * x[id1] - x[id2]) + (1.0 * y[id1] - y[id2]) * (1.0 * y[id1] - y[id2]));
  55. }
  56.  
  57. struct Aho_Corasick {
  58. int next[][], fail[], End[];
  59. int root, cnt;
  60.  
  61. int newnode() {
  62. for (int i = ; i < ; i++) next[cnt][i] = -;
  63. End[cnt++] = ;
  64. return cnt - ;
  65. }
  66.  
  67. void init() {
  68. cnt = ;
  69. root = newnode();
  70. }
  71.  
  72. void insert(int len) {
  73. int now = root;
  74. for (int i = ; i < len; i++) {
  75. if (next[now][buf[i]] == -) next[now][buf[i]] = newnode();
  76. now = next[now][buf[i]];
  77. }
  78. End[now]++;
  79. }
  80.  
  81. void build() {
  82. queue<int> Q;
  83. fail[root] = root;
  84. for (int i = ; i < ; i++)
  85. if (next[root][i] == -) next[root][i] = root;
  86. else {
  87. fail[next[root][i]] = root;
  88. Q.push(next[root][i]);
  89. }
  90. while (!Q.empty()) {
  91. int now = Q.front();
  92. Q.pop();
  93. if (End[fail[now]]) End[now] = ;
  94. for (int i = ; i < ; i++)
  95. if (next[now][i] == -) next[now][i] = next[fail[now]][i];
  96. else {
  97. fail[next[now][i]] = next[fail[now]][i];
  98. Q.push(next[now][i]);
  99. }
  100. }
  101. }
  102.  
  103. double dp[][];
  104.  
  105. void solve() {
  106. for (int i = ; i <= n; ++i)
  107. for (int j = ; j < cnt; ++j)
  108. dp[i][j] = INFLL;
  109. dp[][next[root][]] = ;
  110. for (int i = ; i <= n; ++i) {
  111. for (int j = ; j < cnt; ++j) {
  112. if (dp[i][j] == INFLL) continue;
  113. for (int k = i + ; k <= n; ++k) {
  114. int idx = next[j][k];
  115. if (End[idx]) continue;
  116. dp[k][idx] = min(dp[k][idx], dp[i][j] + cal(i, k));
  117. }
  118. }
  119. }
  120. double ans = INFLL;
  121. for (int i = ; i < cnt; ++i) ans = min(ans, dp[n][i]);
  122. if (ans == INFLL) printf("Can not be reached!\n");
  123. else printf("%.2f\n", ans);
  124. }
  125.  
  126. void debug() {
  127. for (int i = ; i < cnt; i++) {
  128. printf("id = %3d,fail = %3d,end = %3d,chi = [", i, fail[i], End[i]);
  129. for (int j = ; j < ; j++) printf("%2d", next[i][j]);
  130. printf("]\n");
  131. }
  132. }
  133. } ac;
  134.  
  135. int main() {
  136. // FIN;
  137. while (~sffi(n, m)) {
  138. if (n == && m == ) break;
  139. for (int i = ; i <= n; ++i) sffi(x[i], y[i]);
  140. ac.init();
  141. for (int i = ; i < m; ++i) {
  142. sfi(k);
  143. for (int j = ; j < k; ++j) sfi(buf[j]);
  144. ac.insert(k);
  145. }
  146. ac.build();
  147. ac.solve();
  148. }
  149. return ;
  150. }

小明系列故事――女友的考验 HDU - 4511 AC自动机+简单DP的更多相关文章

  1. HDU 4511 小明系列故事——女友的考验 (AC自动机+DP)

    小明系列故事——女友的考验 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total ...

  2. HDU 4511 小明系列故事——女友的考验 (AC自动机 + DP)

    小明系列故事——女友的考验 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total ...

  3. HDU4511 小明系列故事——女友的考验 —— AC自动机 + DP

    题目链接:https://vjudge.net/problem/HDU-4511 小明系列故事——女友的考验 Time Limit: 500/200 MS (Java/Others)    Memor ...

  4. HDU - 4511 小明系列故事――女友的考验(AC自己主动机+DP)

    Description 最终放寒假了,小明要和女朋友一起去看电影.这天,女朋友想给小明一个考验,在小明正准备出发的时候.女朋友告诉他.她在电影院等他,小明过来的路线必须满足给定的规则:  1.如果小明 ...

  5. HDU 4511 小明系列故事——女友的考验 ( Trie图 && DP )

    题意 :  给出编号从1 ~ n 的 n 个平面直角坐标系上的点,求从给出的第一个点出发到达最后一个点的最短路径,其中有两种限制,其一就是只能从编号小的点到达编号大的点,再者不能走接下来给出的 m 个 ...

  6. HDU 4511 小明系列故事——女友的考验 (AC自动机 + DP)题解

    题意:从 1 走到 n,要求所走路径不能出现给定的路径,求最短路 思路:因为要求不能出现给定路径,那么我可以求助ac自动机完成判断. 我们可以在build的时候标记哪些路径不能出现,显然下面这种表示后 ...

  7. HDU4511 小明系列故事——女友的考验(AC自动机 + DP)

    题目大概说有平面有n个点,从1点出发走到n点,每一步只能走到序号比当前更大的点且走的序列不能包含给定的m个序列中的任何一个,问1走到n的最短路. 用m个序列建个AC自动机,后缀包含整个序列的结点标记一 ...

  8. hdu4511小明系列故事——女友的考验(ac自动机+最短路)

    链接 预处理出来任意两点的距离,然后可以顺着trie树中的节点走,不能走到不合法的地方,另开一维表示走到了哪里,依次来更新. 注意判断一下起点是不是合法. #include <iostream& ...

  9. HDU-4511 小明系列故事——女友的考验 floyd变种-标号递增最短路

    题意:给定N个点,现在要求出从1号点到N号点的最短路.题目给的限制条件就是对于某条路径是不能够走的,但是可以选择某段路径走,另外就是所走的路径的标号必须是递增的. 分析:由于给定的是一些列的坐标点,这 ...

随机推荐

  1. 使用maven插件反向映射generatorConfig.xml生成代码

    一.配置Maven pom.xml 文件 <!-- 反向映射 --> <plugin> <groupId>org.mybatis.generator</gro ...

  2. HTTPS 加密机制

    目录 1. HTTPS 概述 2. 对称加密 3. 非对称加密 4. 非对称加密改良方案 5. 非对称加密 + 对称加密 6. 中间人攻击 7. 数字证书 8. 数字签名 9. HTTPS 工作原理 ...

  3. RZ、NRZ、NRZI、曼彻斯特编码

    Frm: http://blog.sina.com.cn/s/blog_78e87ba10102wj9g.html 在数字电路中,组成一连串信息的基元就是0和1,无论是在CPU.DSP.MCU甚至是个 ...

  4. pair的用法

    如何定义?(初始化) 1. pair<int,int>p; 2.定义即初始化,也可以这个样子 pair<,); 里面的类型还可以是string,double等. 3.还可以这样子初始 ...

  5. 拾遗:ssh 公钥连接前的相关准备

    ssh 公钥连接条件: sshd_config 中启用公钥认证 authorized_keys 文件权限必须为 0600 目标用户的 家目录 权限必须为 0700 目标账户必须已设定登陆密码(即处于可 ...

  6. 注解@Override

    Android的开发者对@Override肯定是非常熟悉,不管是自己的代码中还是书上都会出现,但是他是什么意思呢?如下: @Override是伪代码,表示重写(当然不写也可以),不过写上有如下好处: ...

  7. error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "stdafx.h"”?

    解决方案: 属性>预编译头>不使用预编译头>应用

  8. 人工智能都能写Java了!这款插件让你编程更轻松

    最近在浏览技术社区,发现了一款 IDE 插件,利用人工智能技术帮助程序员高效写代码.节省开发时间,一下子勾起了我的好奇心. 下载之后,使用一番,确实蛮好的,可以有效提升编程效率. 这款插件叫:aixc ...

  9. 关于while循环中的break和continue的区别

    while循环如果不加条件限制的话,它会一直循环下去,那么问题就来了,如果我不用条件去终止while循环的话,那么我该用什么方法去终止呢? 你可以选择两种终止while循环的方法 1.break  强 ...

  10. 笔记54 Mybatis快速入门(五)

    Mybatis中注解的使用 1.XML方式的CRUD 新增加接口CategoryMapper ,并在接口中声明的方法上,加上注解对比配置文件Category.xml,其实就是把SQL语句从XML挪到了 ...