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. 【POJ 3740】 Easy Finding

    [题目链接] http://poj.org/problem?id=3740 [算法] Dancing Links算法解精确覆盖问题 详见这篇文章 : https://www.cnblogs.com/g ...

  2. warning: here-document at line 7 delimited by end-of-file (wanted `rui')

  3. Section %post does not end with %end

    Section %post does not end with %end Exception AttributeError: "NoneType" object no attrib ...

  4. fopen文件目录问题

    程序当前目录下.如果是在 VC 里面运行的, 这个目录是工程的目录. 如果是双击 exe 运行的, 这个目录就是 exe 所在的目录.

  5. B - IQ test

    Problem description Bob is preparing to pass IQ test. The most frequent task in this test is to find ...

  6. 题解报告:hdu 4764 Stone(巴什博弈)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4764 Problem Description Tang and Jiang are good frie ...

  7. Spring 整合 Redis (零配置) 的简单使用

    pom.xml <!--jedis--> <dependency> <groupId>redis.clients</groupId> <artif ...

  8. 【Linux】修改Linux操作系统字符集与Oracle数据库一致

    #数据库中查看所使用字符集 SQL> select userenv('language') from dual; USERENV('LANGUAGE') -------------------- ...

  9. 【原创】你知道Oracle 10G能存多少数据吗

    昨天晚上在看Oracle 10G联机文档中关于bigfile tablespaces的描述(引用1),发现了关于Oracle存储极限的简单描述.bigfile tablespaces的存在,让Orac ...

  10. slf4j日志只输出到控制台,没输出到日志文件

    最近使用SLF4J遇到了一个比较头疼的坑,日志输出到控制台没有问题,但是始终没有输出到日志文件.无论怎麽修改日志配置,始终是老样子. 有一种绝望,是各种百度.google却还是解决不了问题..直到我在 ...