ZOJ-1129

来源:互联网 发布:java 取绝对值函数 编辑:程序博客网 时间:2024/06/16 16:22

粗看以为挺简单,细想还是需要点算法的。。字符串的map处理挺繁琐,感觉JAVA的集合类总不怎么好用。。反正基本思路就是BFS,通过那个最有名作者找各个作者与他的最短距离

import java.util.HashMap;import java.util.HashSet;import java.util.LinkedList;import java.util.Map;import java.util.Scanner;public class Main{static Map<String, HashSet<String>> map = new HashMap<String, HashSet<String>>();static Map<String, Integer> result = new HashMap<String, Integer>();static Map<String, Boolean> flag = new HashMap<String, Boolean>();static void relations(String[] authors){for (String author : authors){HashSet<String> set;if (!map.containsKey(author)){set = new HashSet<String>();map.put(author, set);}elseset = map.get(author);for (String s : authors)if (!s.equals(author))set.add(s);}}static void bfs(){LinkedList<String> queue = new LinkedList<String>();String start = "Erdos, P.";result.put(start, 0);flag.put(start, true);queue.addLast(start);while (!queue.isEmpty()){String s = queue.removeFirst();if (map.containsKey(s)){HashSet<String> set = map.get(s);int number = result.get(s);for (String relate : set){if (!flag.get(relate)){flag.put(relate, true);result.put(relate, number + 1);queue.addLast(relate);}}}}}public static void main(String[] args){Scanner sc = new Scanner(System.in);int count = 0;while (true){int p = sc.nextInt();int n = sc.nextInt();if (p == 0 && n == 0)break;sc.nextLine();map.clear();result.clear();flag.clear();for (int i = 0; i < p; i++){String s = sc.nextLine().split(":")[0];String ss[] = s.split(", ");String authors[] = new String[ss.length / 2];for (int j = 0; j < ss.length; j += 2){String temp = ss[j] + ", " + ss[j + 1];authors[j / 2] = temp;result.put(temp, Integer.MAX_VALUE);flag.put(temp, false);}relations(authors);}bfs();System.out.format("Database #%d\n", ++count);for (int i = 0; i < n; i++){String author = sc.nextLine();if (!result.containsKey(author)|| result.get(author) == Integer.MAX_VALUE)System.out.format("%s: infinity\n", author);elseSystem.out.format("%s: %d\n", author, result.get(author));}System.out.println();}sc.close();}}


0 0