粗看以为挺简单,细想还是需要点算法的。。字符串的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);
}
else
set = 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);
else
System.out.format("%s: %d\n", author, result.get(author));
}
System.out.println();
}
sc.close();
}
}