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
java
/**
* 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 0;
}
if (s == t) {
return 0;
}
Map<UndirectedGraphNode, Integer> map = new HashMap<>();
Queue<UndirectedGraphNode> queue = new LinkedList<>();
map.put(s, 0);
queue.offer(s);
while (!queue.isEmpty()) {
UndirectedGraphNode node = queue.poll();
int step = map.get(node);
for (UndirectedGraphNode val : node.neighbors) {
if (val == t) {
return step + 1;
}
if (!map.containsKey(val)) {
map.put(val, step + 1);
queue.offer(val);
}
}
}
return -1;
}
}