POJ 2607 / ZOJ 1857 Fire Station (临接表+spfa)

噩梦。。真是噩梦,GB同学给初学者留下的这个任务,显然有点高估我们的实力了。

 

我做这道题的时候是一波N折,先后产生了五个版本,现在我的思考过程以及代码都弄出来,大家借鉴一下:

 

1、刚开始是最最原始的方法,dijkstra暴力求解,显然效率是非常低的,在本机上跑了9s,简单优化一下,八秒。。然后就再也没有提升的空间了。ps:在网上搜索到了测试数据,经验证,和浙大的数据完全一样,但是poj上的就不一样,我估计是poj上删掉了某组数据,而且他上面的时间限制是5s,在zoj上是1s。。

 

2、在网上看优先队列可以优化,我又把stl中priority_queue的东东看了看,写出来之后感觉时间上是有减少的 ,提交poj,4s过但是zojWA我后来仔细研究了算法的整个过程,发现当我把一个点加入到队列中后,如果他的距离被更新之后就会被再次加入队列中,所以我那个算法是错误的,虽然可以优化,我不会,如果优化成功的话,在zoj能跑300ms。。。这两个oj时间怎么差这么多呢??PS:我后来又了解到Johnson算法,用临界表+斐波那契堆。。。我呆呆的看了好长时间,最后问cw的时候,他说大黄都搞不清楚那个是怎么用的,我faint。。。。

 

3、然后想到了floyd,求每个顶点对的最短路径,这个还没有讲,我简单看了看,没有看懂,好像要用到矩阵运算的知识。我比葫芦画瓢写了一个,然后结果竟然是对的,提交zoj,超时。提交poj,938ms。。。。这算是第一次AC吧。由于Floyd代码简单,没有什么优化的方法了,再想下一种方法。

 

4、优先队列那个我是不会用了,那就只用临界表吧,我是用数组实现的。最后在poj2672ms过,zoj的TLE。

 

5、在将近绝望的时候,我想到了cw提到过的spfa,我仿佛看到了救星,,,,曙光貌似就在前方。baidu+google,学了学他,果然跟bfs有点相像。具体想看的点这里

 

虽然我将近三天才做完,但是我的收获不仅仅是这一道题,图论的算法我多少都看了看。各种名词也不再感觉陌生和害怕了,有些知识只要你敢于去学,你会发现当你最终懂得时候你用的时间并不多。。。。继续努力~!

 

本题代码几经修改很冗长,有很多可以改的,懒了。。直接贴:

 

 

堆优化+邻接表,搞了好长时间。。。。。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值