Search Graph Nodes Lintcode

Given a undirected graph, a node and a target, return the nearest node to given node which value of it is target, return NULL if you can't find.

There is a mapping store the nodes' values in the given parameters.

 Notice

It's guaranteed there is only one available solution

Example
2------3  5
 \     |  | 
  \    |  |
   \   |  |
    \  |  |
      1 --4
Give a node 1, target is 50

there a hash named values which is [3,4,10,50,50], represent:
Value of node 1 is 3
Value of node 2 is 4
Value of node 3 is 10
Value of node 4 is 50
Value of node 5 is 50

Return node 4

这道题思路就是bfs,求最短路径一般都用bfs。

一开始忘记了如果这个点本身的点就是要查的点的情况。发现了以后又加了一个if判断。

public class Solution {
    /**
     * @param graph a list of Undirected graph node
     * @param values a hash mapping, <UndirectedGraphNode, (int)value>
     * @param node an Undirected graph node
     * @param target an integer
     * @return the a node
     */
    public UndirectedGraphNode searchNode(ArrayList<UndirectedGraphNode> graph,
                                          Map<UndirectedGraphNode, Integer> values,
                                          UndirectedGraphNode node,
                                          int target) {
        Queue<UndirectedGraphNode> q = new LinkedList<>();
        q.offer(node);
        HashSet<UndirectedGraphNode> visited = new HashSet<>();
        visited.add(node);
        while (!q.isEmpty()) {
            UndirectedGraphNode n = q.poll();
            if (values.get(n) == target) {
                    return n;
            }
            for (UndirectedGraphNode subN : n.neighbors) {
                if (visited.contains(subN)) {
                    continue;
                }
                if (values.get(subN) == target) {
                    return subN;
                }
                q.offer(subN);
                visited.add(subN);
            }
        }
        return null;
    }
}

看了下答案还是很简洁的,每个点都会入queue一次,所以可以在外层判断。可是只是可能会慢一点点。

但是代码很简洁。

/**
 * Definition for graph node.
 * class UndirectedGraphNode {
 *     int label;
 *     ArrayList<UndirectedGraphNode> neighbors;
 *     UndirectedGraphNode(int x) { 
 *         label = x; neighbors = new ArrayList<UndirectedGraphNode>(); 
 *     }
 * };
 */
public class Solution {
    /**
     * @param graph a list of Undirected graph node
     * @param values a hash mapping, <UndirectedGraphNode, (int)value>
     * @param node an Undirected graph node
     * @param target an integer
     * @return the a node
     */
    public UndirectedGraphNode searchNode(ArrayList<UndirectedGraphNode> graph,
                                          Map<UndirectedGraphNode, Integer> values,
                                          UndirectedGraphNode node,
                                          int target) {
        Queue<UndirectedGraphNode> q = new LinkedList<>();
        HashSet<UndirectedGraphNode> visited = new HashSet<>();
        
        q.offer(node);
        visited.add(node);
        
        while (!q.isEmpty()) {
            UndirectedGraphNode n = q.poll();
            if (values.get(n) == target) {
                return n;
            }
            for (UndirectedGraphNode subN : n.neighbors) {
                if (!visited.contains(subN)) {
                    q.offer(subN);
                    visited.add(subN);
                }
            }
        }
        return null;
    }
}

 

 
posted @ 2017-03-05 07:12  璨璨要好好学习  阅读(821)  评论(0编辑  收藏  举报