ZOJ-2406

来源:互联网 发布:知乎 金庸哪个最好 编辑:程序博客网 时间:2024/06/05 11:23

仍然是路径搜索,不过本题要求存储下可行的路径,难度也没什么,感觉代码写的有点丑,嵌了好多JAVA的泛型在里面。。但我感觉没法避免啊,python自从上次递历溢出之后就不敢用了。。有心理阴影,全部重写一次可不是好玩的事情,100多行代码还不算太少吧

import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;import java.util.HashMap;import java.util.LinkedList;import java.util.Map;import java.util.Scanner;public class Main{static int nv, nr, sv, dv, maxd;static Map<Integer, ArrayList<int[]>> map = new HashMap<Integer, ArrayList<int[]>>();static LinkedList<Integer> path = new LinkedList<Integer>();static ArrayList<ArrayList<Integer>> allpath = new ArrayList<ArrayList<Integer>>();static void dfs(int city, int d){if (city == dv){ArrayList<Integer> temp = new ArrayList<Integer>();temp.add(d);for (int i : path)temp.add(i);temp.add(city);allpath.add(temp);return;}ArrayList<int[]> adjs = map.get(city);for (int[] adj : adjs)if (!path.contains(adj[0]) && (d + adj[1]) <= maxd){path.add(city);dfs(adj[0], d + adj[1]);path.removeLast();}}static class PathComparator implements Comparator<ArrayList<Integer>>{public int compare(ArrayList<Integer> o1, ArrayList<Integer> o2){int index = 0;while (true){int diff = o1.get(index) - o2.get(index);if (diff != 0)return diff;index++;}}}static void printPath(int number){if (number > 1)System.out.println();System.out.format("Case %d:\n", number);for (ArrayList<Integer> list : allpath){System.out.print(" " + list.get(0) + ":");for (int i = 1; i < list.size(); i++)System.out.print(" " + list.get(i));System.out.println();}}public static void main(String[] args){Scanner sc = new Scanner(System.in);PathComparator pc = new PathComparator();int number = 0;while ((nv = sc.nextInt()) != -1){map.clear();path.clear();allpath.clear();nr = sc.nextInt();while (nr-- > 0){int a = sc.nextInt();int b = sc.nextInt();int c = sc.nextInt();ArrayList<int[]> adjs;adjs = map.get(a);if (adjs == null){adjs = new ArrayList<int[]>();map.put(a, adjs);}adjs.add(new int[] { b, c });adjs = map.get(b);if (adjs == null){adjs = new ArrayList<int[]>();map.put(b, adjs);}adjs.add(new int[] { a, c });}sv = sc.nextInt();dv = sc.nextInt();maxd = sc.nextInt();dfs(sv, 0);Collections.sort(allpath, pc);printPath(++number);}}}


0 0
原创粉丝点击