SHIT,SHIT,SHIT,SHIT,SHIT...

这道题可以使用AC自动机+DP来解决。也就是用非法路径建立TRIE图,然后从trie[root][1]点开始广搜DP即可。千万要注意一点,题目里有说:小明每次走的时候只能走到比当前所在点编号大的位置

因为这个WA了无限次。。。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#define LL __int64 using namespace std;
const int N=25000;
const int root=0;
int trie[N][55];
int fail[N];
bool tag[N];
int que[N],head,tail,tot;
int n,m;
double dp[550][55],d[55][55]; struct Point{
double x,y;
}point[55]; void init(){
for(int i=0;i<=549;i++){
for(int j=0;j<=50;j++)
dp[i][j]=1e20;
}
head=tail=tot=0;
memset(fail,-1,sizeof(fail));
memset(tag,false,sizeof(tag));
} double dist(int i,int j){
return sqrt((point[i].x-point[j].x)*(point[i].x-point[j].x)+(point[i].y-point[j].y)*(point[i].y-point[j].y));
} int sthead,stail;
struct Stat{
int pos_in_trie,pos;
Stat(){};
Stat(int a,int b){ pos_in_trie=a,pos=b; }
}stque[N*10]; void clr(int p){
memset(trie[p],-1,sizeof(trie[p]));
} void build_ac(){
head=tail=0;
que[tail++]=root;
while(head!=tail){
int tmp=que[head++];
int p=-1;
for(int i=1;i<=n;i++){
if(trie[tmp][i]!=-1){
if(tmp==root) fail[trie[tmp][i]]=root;
else{
p=fail[tmp];
while(p!=-1){
if(trie[p][i]!=-1){
fail[trie[tmp][i]]=trie[p][i];
break;
}
p=fail[p];
}
if(p==-1) fail[trie[tmp][i]]=root;
}
if(tag[fail[trie[tmp][i]]]) tag[trie[tmp][i]]=tag[fail[trie[tmp][i]]];
que[tail++]=trie[tmp][i];
}
else{ //trie[tmp][i]==-1
if(tmp==root) trie[tmp][i]=root;
else{
p=fail[tmp];
while(p!=-1){
if(trie[p][i]!=-1){
trie[tmp][i]=trie[p][i];
break;
}
p=fail[p];
}
if(p==-1) trie[tmp][i]=root;
}
}
}
}
} void BFS(){
Stat tmp;
while(sthead<stail){
tmp=stque[sthead++];
for(int i=tmp.pos;i<=n;i++){
if(!tag[trie[tmp.pos_in_trie][i]]){
if(dp[trie[tmp.pos_in_trie][i]][i]>dp[tmp.pos_in_trie][tmp.pos]+d[i][tmp.pos]){
dp[trie[tmp.pos_in_trie][i]][i]=dp[tmp.pos_in_trie][tmp.pos]+d[i][tmp.pos];
stque[stail++]=Stat(trie[tmp.pos_in_trie][i],i);
}
}
}
}
} int main(){
int k;
while(scanf("%d%d",&n,&m),n||m){
init();
for(int i=1;i<=n;i++)
scanf("%lf%lf",&point[i].x,&point[i].y);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
d[i][j]=dist(i,j);
}
int p,tmp;
clr(0);
for(int i=1;i<=m;i++){
scanf("%d",&k);
p=0;
for(int j=1;j<=k;j++){
scanf("%d",&tmp);
if(trie[p][tmp]==-1){
clr(++tot);
trie[p][tmp]=tot;
}
p=trie[p][tmp];
}
tag[p]=true;
}
build_ac();
sthead=stail=0;
dp[trie[root][1]][1]=0;
stque[stail++]=Stat(trie[root][1],1);
BFS();
double ans=1e20;
for(int i=0;i<550;i++)
ans=min(ans,dp[i][n]);
if(ans==1e20)
printf("Can not be reached!\n");
else printf("%.2lf\n",ans);
}
return 0;
}

  

HDU 4511的更多相关文章

  1. HDU 4511 (AC自动机+状态压缩DP)

    题目链接:  http://acm.hdu.edu.cn/showproblem.php?pid=4511 题目大意:从1走到N,中间可以选择性经过某些点,比如1->N,或1->2-> ...

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

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

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

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

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

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

  5. hdu 4511 (AC自动机)

    注意标记一个点后,fail树上的子节点都会被标记 跑spfa,dp也可以 #include<iostream> #include<cstdio> #include<str ...

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

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

  7. 小明系列故事――女友的考验 HDU - 4511 AC自动机+简单DP

    题意:自己看题目,中文体面. 题解: 把所有不能走的路径放入AC自动机中. 然后DP[i][j]表示走到 i 这个点,且位于AC自动机 j 这个节点最短距离 然后直接DP即可.注意一点会爆int #i ...

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

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

  9. KUANGBIN带你飞

    KUANGBIN带你飞 全专题整理 https://www.cnblogs.com/slzk/articles/7402292.html 专题一 简单搜索 POJ 1321 棋盘问题    //201 ...

随机推荐

  1. E20170828-mk

    utils  工具类; 效用; 实用工具; 实用菜单; Documentation  n. 记录; 证明某事属实的证据; 参考资料; 文献的编集,文件分类; receive   vt. 收到; 接待; ...

  2. Palindrome(dp)

    http://poj.org/problem?id=1159 题意:给定一个字符,问最少插入多少字符,使该字符串变成回文字符串. 思路:设原字符串序列为X,其逆字符串为Y,则最少插入的字符数=leng ...

  3. codevs2594解药还是毒药(状压dp)

    2594 解药还是毒药  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond     题目描述 Description Smart研制出对付各种症状的解药,可是 ...

  4. 移动App服务端架构设计

      我从事手机app服务端开发现在已经是3个年头,自己也整理出了一套相对好用的服务架构,写出来,跟大家一起分享.如有不足,还请多指教. 一:基础流程图. 其实有一点还需要加上,就是对json的压缩和加 ...

  5. 语法错误1:TabError: Inconsistent use of tabs and spaces in indentation

    如图错误: 出错原因: 由于写代码过程用的tab缩进 解决方法: 把tab缩进改用空格缩进

  6. SQL学习--Select(一)TOP、派生表、连接、谓词

    TOP关键字 WITH TIES t.title,sum(s.qty)as totalSales from sales s left join titles t on s.title_id=t.tit ...

  7. 关于Membership和身份认证的记录

    在今天写好的code中测试环节,当我用webconfig中的测试数据库就是ok的,但是更替为正式的就不行了: 报错的类是MemberShip,那就关系到身份认证的环节了 找了几个链接,记录下 1.身份 ...

  8. 阿里巴巴矢量库IconFont__使用小录

    使用阿里巴巴矢量库方法虽然不难,但本人记性不好,遂在次记录几笔 阿里巴巴矢量库地址:http://www.iconfont.cn/plus 阿里巴巴矢量库图标好处: 1:图标矢量化 2:自己总结:ic ...

  9. weblogic详解

    一.简介 WebLogic是美国Oracle公司出品的一个application server,确切的说是一个基于JAVAEE架构的中间件,WebLogic是用于开发.集成.部署和管理大型分布式Web ...

  10. promise原理及使用方法

    Promise 的含义 所谓Promise ,简单说就是一个容器,里面保存着某个未来才回结束的事件(通常是一个异步操作)的结果.从语法上说,Promise是一个对象,从它可以获取异步操作的消息. re ...