| ||||||||||
| 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 | |||||||||
贴Java代码。 O(V*E) ,带注释//下一页也有一人贴了java的代码,那个代码结构非常清晰但是略感冗余
//我在这里同样用BellmanFord算法实现,但代码精简了很多,java排行榜22(当时)
//最差的情况计算量是V*E (点总数 乘以 边总数)
import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 这个链表用于保存所有的边,包括虫洞
LinkedList<edge> es;
// 记录各点距离,自动初始化全为0
int dist[];
int F = new Integer(br.readLine());
while(F-->0){
String input[] = br.readLine().split("\\s");
int N = new Integer(input[0]), M = new Integer(input[1]), W = new Integer(input[2]);
dist = new int[N+1];
es = new LinkedList<edge>();
// 在这里输入所有的边,i<M时输入的是双向的小径
// i>=M时输入的是虫洞,单向,距离变为负数
for(int i = 0; i < M+W; i++){
String input2[] = br.readLine().split("\\s");
int a = new Integer(input2[0]);
int b = new Integer(input2[1]);
int d = new Integer(input2[2]);
if(i<M){
es.add(new edge(a,b,d));
es.add(new edge(b,a,d));
}else{
es.add(new edge(a,b,-d));
}
}
// 下面是BellmanFord主算法,原理网上多得是我就不说了。
for(int i = 1; i <= N; i++){
boolean ud = false;
for(edge e : es){
int d = dist[e.from] + e.dist;
if(d < dist[e.to]){
dist[e.to] = d;
ud = true;
}
}
if(!ud){
System.out.println("NO");
break;
}
if(i==N){
System.out.println("YES");
break;
}
}
}
}
}
class edge{
int from, to, dist;
edge(int from, int to,int dist){
this.from = from;
this.to = to;
this.dist = dist;
}
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator