引用http://bbs.csdn.net/topics/390773701
这里贴出自己实现的代码:
在A,B两个城市之间设有N个路站(如下图中的S1,且N<100),城市与路站之间、路站和路站之间各有若干条路段(各路段数≤20,且每条路段上的距离均为一个整数)。
A,B的一条通路是指:从A出发,可经过任一路段到达S1,再从S1出发经过任一路段,…最后到达B。通路上路段距离之和称为通路距离(最大距离≤1000)。当所有的路段距离给出之后,求出所有不同距离的通路个数(相同距离仅记一次)。
例如:下图所示是当N=1时的情况:
迭代算法:
import java.util.HashSet;
public class TestNode1 {
public static void main(String[] args) {
int[][] distance = { { 5, 7, 4 }, { 6, 5 } };
HashSet setG = new HashSet();
for (int i = 0; i < distance.length; i++) {
HashSet temp = new HashSet();
temp.addAll(setG);
setG.clear();
for (int dd : distance[i]) {
if (i == 0) {
setG.add(dd);
}
for (int d : temp) {
setG.add(d + dd);
}
}
}
System.out.println(setG);
}
}
该算法的数据结构设计时,参考了图结构的思想,所以有点笨重;
这是其他稍复杂的一个例子来验证:
输出的结果是:
[13, 14, 15, 17, 16, 19, 18, 21, 20, 23, 22, 25, 24, 27, 26, 29, 28, 30]
import java.util.HashSet;
import java.util.Set;
public class TestNode1 {
static Set setG = new HashSet();// 用来装不同的 可行的 通路长度
public static void main(String[] args) {
int[] d4 = { 8, 4, 3 };
int[] d3 = { 1, 2 };
int[] d2 = { 10, 9, 8, 4 };
int[] d1 = { 5, 8, 10 };
Node n5 = new Node(null, null);// 终点
Node n4 = new Node(d4, n5);
Node n3 = new Node(d3, n4);
Node n2 = new Node(d2, n3);
Node n1 = new Node(d1, n2);
search(n1, n3, 0);
System.out.println(setG);// 输出可行的通路长度
}
static void search(Node start, Node end, int dis) {
if (start.next != null) {
for (int distance : start.distanceToNext) {
int temp = dis + distance;
search(start.next, end, temp);
}
} else {
setG.add(dis);
}
}
}
class Node {
int[] distanceToNext;// 到下一个节点的各个距离
Node next;// 下一个节点
public Node(int[] d, Node next) {
distanceToNext = d;
this.next = next;
}
}