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 |
Bellman-Ford 水过 (用Java的)这道题目,普通洞是双向的,虫洞是单向的。 然后,只要判断是不是有负回路就可以了,所以,直接用《算导》里面的Bellman-Ford就可以了。 Bellman-Ford算法,是能够判断出图上是不是用负回路的,无论从哪个点开始初始化都可以,所以,就只要执行一次Bellman-Ford,就可以看出该图是不是有负回路了。 import java.util.Scanner; public class Main { private class Path { public int s1; public int s2; public int length; Path( int s1,int s2,int length ) { this.s1 = s1; this.s2 = s2; this.length = length; } } private int n; //N个洞 private int m; //M条路 private int w; //W个虫洞 private Path[] ps; //ps为所有的路径,包括虫洞的 private int[] d; Main( int n,int m,int w ) //初始化 { this.n = n; this.m = m; this.w = w; this.ps = new Path[2*m+w]; this.d = new int[n+1]; } public void setPath( int i,int s1,int s2,int length ) { this.ps[i] = new Path( s1,s2,length ); } private void initializtion( int s ) { for( int i=1;i<n;i++ ) { d[i] = 65555; } d[s] = 0; } private void Relax( Path path ) { if( this.d[path.s2] > this.d[path.s1] + path.length ) { this.d[path.s2] = this.d[path.s1] + path.length; } } private boolean BellmanFord( int s ) //主要是判断是不是有回路 { this.initializtion(s); for( int i=1;i<=n;i++ ) { for( int j=0;j<(2*m+w);j++ ) { this.Relax( this.ps[j] ); } } for( int i=0;i<(2*m+w);i++ ) { Path path = this.ps[i]; if( d[path.s2] > d[path.s1] + path.length ) { return true; } } return false; } public void judge() { if( this.BellmanFord( 1 ) ) //只要从一个顶点开始,有一条负的回路,就可以在里面无限次循环,也就可以判断可以回到目标 { System.out.println( "YES" ); return; } System.out.println( "NO" ); } public static void main(String[] args) { Scanner s = new Scanner(System.in); int f = s.nextInt(); //F张地图 while( f>0 ) { int n = s.nextInt(); int m = s.nextInt(); int w = s.nextInt(); Main main = new Main( n,m,w ); int i=0; for( i=0;i<2*m;i+=2 ) { int s1 = s.nextInt(); int s2 = s.nextInt(); int length = s.nextInt(); main.setPath( i,s1,s2,length ); main.setPath( i+1,s2,s1,length ); } for( int j=0;j<w;j++ ) { int s1 = s.nextInt(); int s2 = s.nextInt(); int length = s.nextInt(); main.setPath( i+j,s1,s2,0-length ); } main.judge(); f--; } } } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator