zoj 1430 || poj 1697 The Erythea Campaign

211 篇文章 0 订阅
53 篇文章 0 订阅

最短路分类里的,zoj只有50个人过,暴汗,不过应该大多数是被冗长的题目给吓住了吧。

 

给你地图,图中的1代表这里有根据地,你越靠近根据地,越容易被敌人发现,危险等级越高。不能从根据地中间穿过。

 

给你起点,终点,求最少的危险等级和使之可以到达,如果没有 输出,no solution。

 

危险等级是这么定义的,你在某个点,这个点离它最近的根据地的距离为d,那么,这个点的危险等级就是,矩阵的长+宽-d。

 

我第一反应,这种图,不符合常规啊,就换了下,把图换成各自的点图,而不是用01代表格子。

 

这么做的好处很多哈,就是可以直观地算起点和终点了。弊端是在最后调试过程中发现的,下面会讲。

 


 

 

第一个BFS的工作是,把每个格子的危险等级算出来,采用用1的格子去BFS周围的格子。

 

第二个BFS就是利用优先队列去算从起点到达终点的最短路了。其中dd数组标记当前从s点到各个点的路,然后如果可以更新的话,就加入队列。我过了之后,把dd给去掉了,MLE了,队列存不下了 = =。。。其中判断不能从根据地里面过我写了个函数,经画图可以看到,只要11的同一侧有0,或者11 在边界处,肯定可以过去。

 

 


 

说下这么存的弊端了,样例过之后WA掉了。自己做了几个数据,发现问题了。看下图右边。

 

 

图中也解释了。右边粉色圆圈画起来的,这种情况,都被1 1 覆盖掉了,但是其实中间那俩11还是可以通过的。这时候就要判断原图这里是否是空格子。画画图就知道怎么判断了,很简单,因为坐标基本还是完全对应的。

 

党的做法是BFS + dij。大致就是,建图,邻接表,每个点和周围四个点相连,然后求最短路。不过木有我的跑得快,嘻嘻。

 

我这题在zoj排名第四,哈哈~~~

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值