zoj 2864 Catch the thief

WA了五版,贡献了50、60次WA。。。我成功地把这个题的AC率降低了好几个百分点。。。伟大吧。。

 

纠结两天多了><。

 

废话不多说了,总之,还是道好题的。

 

说下题意,给你一个图,无向图,有起点,终点,给出q个询问,询问在时间t的时候,小偷可能在哪几个地点。小偷是沿最短路从起点逃到终点的。

 

因为最短路可能有多条,所以造成同一时间,小偷所在地点不同。

 

最短路后,然后找所有的最短路径。以前做过类似的,是从终点往起点找。如果找到点i,dis[i] + edge(i,now) == dis[now],说明这个i点是最短路上的点,然后将它入队,继续找。

 

关于时间的统计,找到一个点的时候,i 点 到 now点的时间,需要统计下,因为可能一个点会用到多次,所以节点的时间不统计,标记下这个节点是最短路里的,最后再统一加上。只要把 dis[i] + 1 到 dis[now] - 1的时间段都加一即可。但是,WA了一天的我想明白了,这个方法不可取。

 

我开始的时候没有想清楚,以为q询问的结果再1000以内,所以还挺高兴得开了short型的1000W的数组。然后WA在3秒多,然后一直想特殊情况。。。直到上午,排除所有的特殊情况,想了下,测试了下,发现,确实存在大于1000的结果,事实上,肯定有大于short型的结果的,所以,很悲剧地WA掉了。

 

网上只有一个程序,是用DFS的,我的想法没有错,所以想办法改进。

 

把所有询问存一下,把在搜索过程询问时间在 dis[i] + 1 到 dis[now] - 1的时间段内的结果++,最后依次输出这些结果即可。

 

这个过程完了之后,需要把在最短路径里的点再算上,看看询问的点是否为这些点,如果是的话,这个询问再++,即可。

 

A掉了,高兴^ ^.

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值