Six degrees of separation is the theory that everyone and everything is six or fewer steps away, by way of introduction, from any other person in the world, so that a chain of "a friend of a friend" statements can be made to connect any two people in a maximum of six steps.
Given a friendship relations, find the degrees of two people, return -1
if they can not been connected by friends of friends.
Example
Gien a graph:
1------2-----4
/
/
--3--/
{1,2,3#2,1,4#3,1,4#4,2,3}
and s = 1
, t = 4
return 2
Gien a graph:
1 2-----4
/
/
3
{1#2,4#3,4#4,2,3}
and s = 1
, t = 4
return -1
层级遍历的BFS。queue + set + size管层 + steps计数。1.入第一个人 2.while循环每一层 3.for循环当前层内每个点,如果找到第二个人了,返回计数器。然后做检测邻居加邻居处理。
/** * Definition for Undirected graph. * class UndirectedGraphNode { * int label; * List<UndirectedGraphNode> neighbors; * UndirectedGraphNode(int x) { * label = x; * neighbors = new ArrayList<UndirectedGraphNode>(); * } * }; */ public class Solution { /* * @param graph: a list of Undirected graph node * @param s: Undirected graph node * @param t: Undirected graph nodes * @return: an integer */ public int sixDegrees(List<UndirectedGraphNode> graph, UndirectedGraphNode s, UndirectedGraphNode t) { // write your code here if (graph == null || graph.size() == 0 || s == null || t == null) { return -1; } Queue<UndirectedGraphNode> queue = new LinkedList<UndirectedGraphNode>(); Set<UndirectedGraphNode> set = new HashSet<UndirectedGraphNode>(); queue.offer(s); set.add(s); int steps = 0; while (!queue.isEmpty()) { int size = queue.size(); for (int i = 0; i < size; i++) { UndirectedGraphNode node = queue.poll(); if (node == t) { return steps; } for (UndirectedGraphNode neighbor : node.neighbors) { if (!set.contains(neighbor)) { queue.offer(neighbor); set.add(neighbor); } } } steps++; } return -1; } }