import java.util.LinkedList; import java.util.List; public class HamiltonCircuit { static boolean[][] graph = {{false, true, false, false, true, false, false, false, false, false, false, false}, {true, false, true, false, false, false, true, true, false, false, false, false}, {false, true, false, true, false, false, false, true, false, false, false, false}, {false, false, true, false, false, false, false, false, true, false, false, false}, {true, false, false, false, false, true, false, false, false, true, false, false}, {false, false, false, false, true, false, true, false, false, false, true, false}, {false, true, false, false, false, true, false, true, false, false, false, false}, {false, true, true, false, false , false, true, false, true, false, false, false}, {false, false, false, true, false, false, false, true, false, false, false, true}, {false, false, false, false, true, false, false, false, false, false, true, false}, {false, false, false, false, false, true, false, false, false, true, false, true}, {false, false, false, false, false, false, false, false, true, false, true, false}}; static boolean[] isGone = new boolean[graph.length]; static List<Integer> path = new LinkedList<Integer>(); public static void main(String[] args) { for (int i=0; i<graph.length; i++) findCircuit(i); } private static void findCircuit(int vertex) { if (path.size() == graph.length) { if (graph[vertex][path.get(0)]) { for (int v: path) System.out.print(v + 1 + " "); System.out.print((path.get(0) + 1) + "\n\n"); } } else { isGone[vertex] = true; path.add(vertex); for (int i=0; i<graph.length; i++) { if (graph[vertex][i] && !isGone[i]) findCircuit(i); } isGone[vertex] = false; path.remove(path.size() - 1); } } }
範例輸入輸出:
Hamilton Circuit 是要在圖上找一個點當作起點,接著把圖上所有的點走訪一遍後回到原點。程式的作法是把所有點都當作起點看看,然後想辦法把每個點都先走過一遍,最後再看看終點能不能回到起點。
因為此程式是解決課本第5章的第26題,所以輸入參數已經寫死在程式裡,之所以沒有範例輸入輸出,是因為這題找不到Hamilton Circuit(如果我的程式沒有錯的話)。
沒有留言:
張貼留言