坑啊。。

  膜了半天byvoid大爷的题解。https://www.byvoid.com/blog/poi-1999-mag/?replytocom=1335/

  一开始从人的位置bfs一波,看看能走到初始包裹哪些方向上。要注意不能穿过初始包裹...byvoid的标程在处理穿过包裹什么的地方有问题...但数据略弱。

  之后如题解所述。

  发现自己不会求点双连通分量QAQ。。那部分就抄标程了...

  大概就是记录一下当前走过的边,遇到割点就一直出栈...和求强连通分量差不多,就是一个点可能在多个点双里面..这个比较烦

 #include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=;
const int xx[]={-,,,},yy[]={,,-,};
struct zs{int too,pre;}e[maxn<<];int tot,last[maxn];
int too[],pre[],la[maxn],tt,st1[maxn],top,cnt,st2[maxn],uuu[][][][];bool uu[maxn];
struct poi{int x,y;}S,T,M;
struct zs1{int x,y,dir;}dl[maxn<<];
int dfn[maxn],low[maxn],tim;
bool gd[maxn],u[maxn];
int id[][],dis[][][],q[maxn];
char mp[][];
int i,j,k,n,m,man,st,ed; inline void ins(int a,int b){
int i=la[a];
while(i&&too[i]!=b)i=pre[i];
if(i)return;
too[++tt]=b,pre[tt]=la[a],la[a]=tt;
}
inline bool same(int a,int b){
int i;bool flag;
for(i=la[a];i;i=pre[i])uu[too[i]]=;
for(i=la[b];i&&!uu[too[i]];i=pre[i]);
flag=i!=;
for(i=la[a];i;i=pre[i])uu[too[i]]=;
return flag;
}
inline bool canget(int x,int y,int dir1,int dir2){
if(!gd[id[x][y]])return ;
if(uuu[x][y][dir1][dir2]<)
return (uuu[x][y][dir1][dir2]=same( id[x+xx[dir1]][y+yy[dir1]] , id[x+xx[dir2]][y+yy[dir2]] ));
else return uuu[x][y][dir1][dir2];
}
void tarjan(int x,int fa){
dfn[x]=low[x]=++tim;int too,u,v;
for(int i=last[x];i;i=e[i].pre)if(dfn[e[i].too]<dfn[x]){
too=e[i].too;
if(!dfn[too]){
st1[++top]=x,st2[top]=too;
tarjan(too,x),low[x]=min(low[x],low[too]);
if(low[too]>=dfn[x]){
gd[x]=;
cnt++;
do{
u=st1[top],v=st2[top],
ins(u,cnt),ins(v,cnt),top--;
}while((u!=x||v!=too)&&(u!=too||v!=x));
}
}
else low[x]=min(low[x],dfn[e[i].too]);
}
} inline void insert(int a,int b){
e[++tot].too=b,e[tot].pre=last[a],last[a]=tot,
e[++tot].too=a,e[tot].pre=last[b],last[b]=tot;
} inline bool check(int x,int y){return x>&&y>&&x<=n&&y<=m&&mp[x][y]!='S';} inline void bfs(int s){
int l=,r=,i,now;q[]=s,u[s]=;
while(l<r)
for(i=last[now=q[++l]];i;i=e[i].pre)if(!u[e[i].too]&&e[i].too!=st)
u[e[i].too]=,q[++r]=e[i].too;
}
inline int run(){
int l=,r=,i,nx,ny,ndir,ndis,x,y;
for(i=;i<;i++){
x=S.x+xx[i],y=S.y+yy[i];
if(check(x,y)&&u[id[x][y]])dl[++r]=(zs1){S.x,S.y,i},dis[S.x][S.y][i]=;//,printf("st:%d,%d\n",x,y);
}
while(l<r){
l++,nx=dl[l].x,ny=dl[l].y,ndir=dl[l].dir,ndis=dis[nx][ny][ndir];
x=nx+xx[ndir^],y=ny+yy[ndir^];//printf("case:%d,%d dis:%d dir:%d\n",nx,ny,ndis,ndir);
if(!check(x,y))continue;
if(x==T.x&&y==T.y)return ndis;
for(i=;i<;i++)
if(check(x+xx[i],y+yy[i])&&!dis[x][y][i]&&canget( x,y,ndir,i ))
dis[x][y][i]=ndis+,dl[++r]=(zs1){x,y,i};
}
return -;
}
int main(){
memset(uuu,,sizeof(uuu));
scanf("%d%d",&n,&m);int tmp=;tot=;
for(i=;i<=n;i++){
scanf("%s",mp[i]+);
for(j=;j<=m;j++)if(mp[i][j]!='S'){
id[i][j]=++tmp;
for(k=;k<;k+=){
int x=i+xx[k],y=j+yy[k];
if(check(x,y))
insert(id[i][j],id[x][y]);//,printf("(%d,%d)-->(%d,%d)\n",x,y,i,j);
}
if(mp[i][j]=='M')man=tmp,M=(poi){i,j};
if(mp[i][j]=='P')st=tmp,S=(poi){i,j};
if(mp[i][j]=='K')ed=tmp,T=(poi){i,j};
}
}//return 233;
for(i=;i<=tmp;i++)if(!dfn[i])tarjan(i,);
// for(i=1;i<=n;i++)for(j=1;j<=m;j++)if(id[i][j]){
// if(mp[i][j]!='S')printf("(%d,%d) %d fa:%d\n",i,j,id[i][j],getfa(id[i][j]));
// if(gd[id[i][j]])printf(" gd: (%d,%d)\n",i,j);
// }
bfs(man);
int ans=run();
if(ans<)puts("NO");else printf("%d\n",ans);
}

[bzoj2574] [Poi1999]Store-Keeper的更多相关文章

  1. 如何删除mac keeper

    如果不小心安装了mac keeper,基本是无法删除的,而且16年以前的方法都不管用.可以这样删除,我已经测试过了,下载https://data-cdn.mbamupdates.com/web/mba ...

  2. ZOJ 2601 Warehouse Keeper

    Warehouse Keeper Time Limit: 2000ms Memory Limit: 65536KB This problem will be judged on ZJU. Origin ...

  3. iOS之App Store上架被拒Legal - 5.1.5问题

    今天在看到App Store 上架过程中,苹果公司反馈的拒绝原因发现了这么一个问题: Legal - 5.1.5 Your app uses background location services ...

  4. 发布APP到app store

    好久好久没写博客了,主要是 都在学习新东西,忙不赢啊. 近段时间在用AC平台学习开发移动APP, 今天开始发布应用. 在ac云控制台编译成ipa后,使用apple提供的Application Load ...

  5. External Configuration Store Pattern 外部配置存储模式

    Move configuration information out of the application deployment package to a centralized location. ...

  6. redux-devtools 浏览器修改Store值

    1. npm install --save-dev redux-devtools 2. npm instal. --redux-devtools-dock-monitor  3. 创建DevTools ...

  7. NopCommerce 在Category 显示 Store List列表

    实现效果如下: 1.在前台Web的Category Menu显示 Store; 2.点击 Store 显示 Store List列表: 3.点击 列表Store 的 Company Name 进入该S ...

  8. Redux原理(一):Store实现分析

    写在前面 写React也有段时间了,一直也是用Redux管理数据流,最近正好有时间分析下源码,一方面希望对Redux有一些理论上的认识:另一方面也学习下框架编程的思维方式. Redux如何管理stat ...

  9. 这两天遇到iphone使用app store下载免费软件,必须验证付款信息才能购物是怎么回事???

    答案: 在你这台设备上再设置一下,具体方法是:1.点设置进入2.点iTunes Store 和App Store 3.点 Apple ID ,如果没设置,设置一下,如果有的,再点击 4.出现一上选择的 ...

随机推荐

  1. Mybatis-----优化配置文件,基于注解CR

    这篇主要写配置文件的优化,例如  jdbc.properties 配置文件  ,引入数据库的文件,例如driver,url,username,password 等,然后在 SqlMapConfig.x ...

  2. Arcade初探[0] 目录与导航

    2017年6月,ESRI开发者页面出现了一个新玩意儿:Arcade. 连接:点我 这是什么东西呢?有什么用呢? 1. 是什么 Arcade一种表达语言,可以在ArcGIS平台上使用.不管是编写简单的脚 ...

  3. java小技术之生成二维码

    把我们需要的链接或者内容生成二维码其实是一件非常容易的事情,有很多办法可以实现,这里我们采用JS方法生成. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTM ...

  4. Oracle学习笔记_07_模糊查询

    附录:参考资料 1.Oracle sql语言模糊查询--like后面的通配符 2.oracle sql语言模糊查询--通配符like的使用教程

  5. C# DataGridView 的UserDeletingRow事件,删除

    DialogResult dr = MessageBox.Show("确认删除记录吗?", "提示", MessageBoxButtons.YesNo);    ...

  6. Pyhon学习_04_字典、集合

    字典.集合两种基本类型都是通过映射的方式访问. 字典 python中的字典和perl中的哈希是很相似的,包括其重要的几条属性: 1. 键值必须是唯一的 2. 键值必须是可哈希的,也就是键值不能够是可变 ...

  7. J2EE 项目本地发布路径及修改

    J2EE的项目Run on Server后,在tomcat安装目录下的webapps没有出现所建立的工程名字. 很明显项目并没有自动部署到tomcat的webapps中而是部署在了别的容器中. 在内置 ...

  8. [转]如何用adb控制MTKLogger

    [DESCRIPTION] 如何通过adb command去控制MTKLogger 开关,设定log路径等等. [KEYWORD] MTKLogger adb控制 路径 大小 [SOLUTION] 1 ...

  9. Python爬虫下载美女图片(不同网站不同方法)

    声明:以下代码,Python版本3.6完美运行 一.思路介绍 不同的图片网站设有不同的反爬虫机制,根据具体网站采取对应的方法 1. 浏览器浏览分析地址变化规律 2. Python测试类获取网页内容,从 ...

  10. 基于springboot微信公众号开发,几分钟学会微信自动回复

    效果图 1.准备工作 申请微信订阅号(个人只能申请订阅号,而且没什么功能,也无法认证),申请完毕,点击 开发=>基本配置,如下图: 服务器配置需要有 域名 80端口,我猜你没有,这里推荐个实用工 ...