Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

Re:一点看法

Posted by shark6625 at 2010-11-20 20:51:22 on Problem 3259 and last updated at 2010-11-21 13:16:42
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:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator