zoukankan      html  css  js  c++  java
  • [LintCode] Six Degrees

     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

     1 /**
     2  * Definition for Undirected graph.
     3  * class UndirectedGraphNode {
     4  *     int label;
     5  *     List<UndirectedGraphNode> neighbors;
     6  *     UndirectedGraphNode(int x) { 
     7  *         label = x;
     8  *         neighbors = new ArrayList<UndirectedGraphNode>(); 
     9  *     }
    10  * };
    11  */
    12 
    13 
    14 public class Solution {
    15     public int sixDegrees(List<UndirectedGraphNode> graph, UndirectedGraphNode s, UndirectedGraphNode t) {
    16         if(graph == null || !graph.contains(s) || !graph.contains(t)) {
    17             return -1;
    18         }
    19         if(s == t) {
    20             return 0;
    21         }
    22         Queue<UndirectedGraphNode> q = new LinkedList<UndirectedGraphNode>();
    23         Set<UndirectedGraphNode> visited = new HashSet<UndirectedGraphNode>();
    24         int layer = 1;
    25         q.add(s);
    26         visited.add(s);
    27         while(!q.isEmpty()) {
    28             int size = q.size();
    29             for(int i = 0; i < size; i++) {
    30                  UndirectedGraphNode curr = q.poll();
    31                  for(UndirectedGraphNode neighbor : curr.neighbors) {
    32                      if(visited.contains(neighbor)) {
    33                          continue;
    34                      }
    35                      if(neighbor == t) {
    36                         return layer; 
    37                      }
    38                      else {
    39                          q.add(neighbor);
    40                          visited.add(neighbor);
    41                      }
    42                  }
    43             }
    44             layer++;
    45         }
    46         return -1;
    47     }
    48 }

    Related Problems

    Clone Graph

  • 相关阅读:
    linux环境下的时间编程
    golang1.13中重要的新特新
    vs2019+cmake实现Linux远程开发
    现代c++与模板元编程
    一个commit引发的思考
    golang中判断两个slice是否相等
    c++性能测试工具:计算时间复杂度
    c++性能测试工具:google benchmark入门(二)
    使用vs2019进行Linux远程开发
    智能指针和二叉树(3):图解查找和删除
  • 原文地址:https://www.cnblogs.com/lz87/p/7496936.html
Copyright © 2011-2022 走看看