题面

正解与图书馆馆长的考验一致,都是分层图SPFA;

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int row,line,keyn,haha,r;
struct typekey{
int x,y;
}key[15][20]={0};
struct node{
int to;
int nxt;
int w;
}a[1000000]={0};
int num[1000][1000],fg[1000][1000],kn[15];
int layer,n,m,tot;
int head[1000000];
void add(int x,int y,int w)
{
tot++;
a[tot].to=y;
a[tot].w=w;
a[tot].nxt=head[x];
head[x]=tot;
}
int dis[1000000],vis[1000000],q[1000000],inf=99999999;
void spfa()
{
int i,j,k,hea,tail;
for(i=1;i<=n;i++) dis[i]=inf;
dis[1]=0;
vis[1]=1;
hea=tail=1;
q[1]=1;
while(hea<=tail)
{
i=q[hea];
for(k=head[i];k;k=a[k].nxt)
{
j=a[k].to;
if(dis[j]>dis[i]+a[k].w)
{
dis[j]=dis[i]+a[k].w;
if(!vis[j])
{
q[++tail]=j;
vis[j]=1;
}
}
}
vis[i]=0;
hea++;
}
}
void build()
{
int i,j,k,x,y,t;
bool havekey[15]={0};
m=row*line;
layer=1<<keyn;
n=m*layer;
for(k=0;k<layer;k++)
{
for(i=1;i<=keyn;i++)
{
if(k&(1<<(i-1))) havekey[i]=1;
else havekey[i]=0;
}
for(i=1;i<=row;i++)
{
for(j=1;j<=line;j++)
{
x=num[i][j];
y=num[i][j+1];
if(y!=0&&fg[x][y]!=-1)
{
if(fg[x][y]==0||havekey[fg[x][y]])
{
add(k*m+x,k*m+y,1);
add(k*m+y,k*m+x,1);
//cout<<k*m+x<<" "<<k*m+y<<" "<<k*m+y<<" "<<k*m+x<<endl;
}
}
y=num[i+1][j];
if(y!=0&&fg[x][y]!=-1)
{
if(fg[x][y]==0||havekey[fg[x][y]])
{
add(k*m+x,k*m+y,1);
add(k*m+y,k*m+x,1);
//cout<<k*m+x<<" "<<k*m+y<<" "<<k*m+y<<" "<<k*m+x<<endl;
}
}
}
}
for(i=1;i<=keyn;i++)
{
if(!havekey[i])
{
t=k+(1<<(i-1));
for(j=1;j<=kn[i];j++)
{
x=num[key[i][j].x][key[i][j].y];
add(k*m+x,t*m+x,0);
//cout<<k*m+x<<" "<<t*m+y<<endl;
}
}
}
}
}
void read()
{
int i,j,k,x,y,p;
cin>>row>>line>>keyn>>haha;
k=0;
for(int i=1;i<=row;i++)
{
for(int j=1;j<=line;j++)
{
num[i][j]=++k;
}
}
cin>>r;
for(int i=1;i<=r;i++)
{
scanf("%d%d",&x,&y);j=num[x][y];
scanf("%d%d",&x,&y);k=num[x][y];
scanf("%d",&p);
if(p==0) p=-1;
fg[j][k]=fg[k][j]=p;
}
scanf("%d",&r);
for(int i=1;i<=r;i++)
{
scanf("%d%d%d",&x,&y,&p);
kn[p]++;
key[p][kn[p]].x=x;
key[p][kn[p]].y=y;
}
}
int main()
{
memset(fg,0,sizeof(fg));
read();
build();
spfa();
int ans=inf;
for(int i=0;i<layer;i++)
{
ans=min(ans,dis[i*m+num[row][line]]);
}
if(ans!=inf)
{
if(ans<=haha) cout<<ans<<endl;
else cout<<(ans-haha)*2+haha;
}
else cout<<char(92)<<" Oh,no! Tita will die /";
}

最新文章

  1. PDO的一些操作
  2. 删除win8的网络连接记录
  3. HDU 3374 最小/大表示法+KMP
  4. ios 各种技术
  5. 2016 - 1 - 22 HTTP(一)
  6. Ajax中解析Json的两种方法详解
  7. 2 - Annotations标注
  8. EL表达式(2)
  9. 又一流氓推广Microsoft Edge,我勒个去
  10. 201521123085 《Java程序设计》第14周学习总结
  11. JAVA反射中的getFields()方法和getDeclaredFields ()方法的区别
  12. [Codeforces 505C]Mr. Kitayuta, the Treasure Hunter
  13. html5中新增的属性和删除的属性
  14. Mycat对MySQL进行垂直水平分表分库,读写分离
  15. 步步为营-33-Md5(32)加密与Base64加密
  16. 事务隔离级别引发的&quot;血案&quot;
  17. LeetCode题解之Largest Number
  18. ES6简介之let和const命令解说
  19. Entity Framework应用:Code First模式数据迁移的基本用法
  20. How to unlock Sample HR database in oracle

热门文章

  1. 【CUDA 基础】4.1 内存模型概述
  2. AtCoder AGC031D A Sequence of Permutations (群论、置换快速幂)
  3. [笔记]动态规划(dynamic programming)
  4. flask登录功能实现的思路
  5. LeetCode 199. 二叉树的右视图(Binary Tree Right Side View)
  6. tp5中很牛皮的一句sql语句,三个条件(两个不确定条件,一个硬性条件)
  7. 导出Excel/Pdf/txt/json/XML/PNG/CSV/SQL/MS-Word/ Ms-Powerpoint/等通过tableExport.js插件来实现
  8. Java 程序员必备的 Intellij IDEA 插件
  9. java源码-LinkedHashMap类设计
  10. extentreports 测试报告引用extend.js/css失败