ZOJ-1129

粗看以为挺简单,细想还是需要点算法的。。字符串的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();
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值