Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
Re:一点看法In Reply To:一点看法 Posted by:quietin at 2009-12-27 15:20:09 首先,一个不需要确定起始点判断负权回路的方法是把dis[1..n]全部置为0,然后做bellman_ford,该方法实际上是以负权路径的端点作为bellman_ford算法的起始点。这种方法可以处理非连通图。 其次,spfa和bellman_ford默认1为起点是对的,因为field之间的path是双向的,只有wormholes之间是单向的,即只有负权路径是单向的,这种情况下只要图是连通的,任何一个点作为起点都可以! > 重做图论,看了一些网上此题的程序,发现不少问题,此题虽然是最最基础的bellman_ford,但用来加深理解还是可以的: > 1)bellman_ford 究竟要relax多少次,当从1到n存在且存在1 -> 2, 2 -> 3 ...n-1 -> n这样的边时,从1开始relax,到n显然是需要n-1次的,而如果其中存在负环的话,若relax次数大于n-1,总是存在新的可以收缩的点,因此最科学的次数是先做n-1次,再做第n次: > 如果n-1次relax前已经不存在,则可以认为提前结束 > 若果第n次relax时仍有可relax点,则有负环的存在 > 2)对于此题,如何控制初值,一个比较原始的想法是,枚举起点,这样的时间复杂度大约为O(n^4),但是还是可以过... > 而经过观察发现,假设有一个原点0,到所有点的距离都是0,那么我们只需要从这个原点出发去判断图中可能出现的负环,因此我们只需要置初值dis[1..n]全部为0(任意相同值均可),做一次bellman_ford即可,而有不少的程序默认从1出发,一个简单的例子: > > 4 2 1 > 2 3 3 > 3 4 1 > 4 2 8 > YES Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator