/**
*
* @param a
* Person a
* @param b
* Person b
* @return a与b之间的距离,返回 0 如果a=b,返回 -1 如果a与b距离为无穷大,
*/
public int getDistance(Person a, Person b) {
if (a.equals(b)) {
return 0;
} else {
int d = 1;
Set<Person> set = new HashSet<Person>();// 存已遍历过的person
List<Person> list1 = new ArrayList<>();// 存下一次的person
list1.add(a);
set.add(a);
//按层遍历无向图
while (true) {
List<Person> list2 = list1;// 将list1赋给list2
list1 = new ArrayList<Person>();// 初始化list1
// 退出while循环条件
if (list2.isEmpty())
break;
for (int i = 0; i < list2.size(); i++) {
Person temp = list2.get(i);
/*
*fgraph即无向图的数据
for (Person key : fgraph.targets(temp).keySet()) {
//确保该节点未遍历过
if (!set.contains(key)) {
if (key.equals(b)) {
return d;
} else {
set.add(key);
list1.add(key);
}
}
}
}
d++;
}
return -1;
}
}
这是本人的实验二作业时,本来想直接用Floyd算法,但是想尝试新的方法,作为新手还是小有成就感的。
思路:以两点间的一点a作为根节点生成树,然后按层遍历,若遍历到另一点b,则停止遍历,并记录此时的层数n,通过n便可得出a,b两点的最短路径,若遍历整棵数未遇到b,则说明a,b两点距离为无穷大。
局限性:只能处理等权的图。