这个无向回路的求法是需要传入一个数组,这个数组是跟图形对应的,图形有几个点就是几乘几的数组,对角线上都是0,比如数组第二行第三列的位子上的数就是图形第2个点和第3个点相连就是1,否则就是0.不懂的可以给我留言,这个方法很好用的,效率很高的,我在求ArcGIS网格问题里面用了,相当高效的。
package chu.softanywhere;
import java.util.ArrayList;
import java.util.List;
public class Getroad {
private int road[][] = null;
private List<int[]> li = new ArrayList<int[]>();
public Getroad(int[][] a) {
this.x1 = new int[a.length];
this.x1[0] = 1;
this.road = a;
for (int i = 2; i < a.length; i++) {
HaMiTonian(1, i);
}
}
private int j;
public List<int[]> road() {
return this.li;
}
private int x1[] = null;
public boolean bb(int x) {
if (x == 1) {
return true;
} else if (x == 0) {
return false;
} else {
return false;
}
}
private void HaMiTonian(int m, int p) {
if (m > p)
return;
while (true) {
NextValue(m);
if (x1[m] == 0)
return;
if (m == p && bb(road[x1[p] - 1][0]))
display1();
else
HaMiTonian(m + 1, p);
}
}
private void NextValue(int k) {
x1[k] = (x1[k] + 1) % (x1.length+1);
if (x1[k] == 0)
return;
if (bb(road[x1[k - 1] - 1][x1[k] - 1])) {
for (j = 0; j < k; j++) {
if (x1[j] == x1[k])
NextValue(k);
}
return;
} else {
NextValue(k);
}
}
private void display1() {
for (int i = 0; i < 7; i++) {
System.out.print(x1[i]);
}
int[] x2=x1.clone();
this.li.add(x2);
System.out.println("");
}
}