zoukankan      html  css  js  c++  java
  • 133. Clone Graph

    问题:

    给定一个图,对该图进行深拷贝,返回拷贝出来的图。

    adj[i]:代表节点 i 所相邻的节点。

    Example 1:
    Input: adjList = [[2,4],[1,3],[2,4],[1,3]]
    Output: [[2,4],[1,3],[2,4],[1,3]]
    Explanation: There are 4 nodes in the graph.
    1st node (val = 1)'s neighbors are 2nd node (val = 2) and 4th node (val = 4).
    2nd node (val = 2)'s neighbors are 1st node (val = 1) and 3rd node (val = 3).
    3rd node (val = 3)'s neighbors are 2nd node (val = 2) and 4th node (val = 4).
    4th node (val = 4)'s neighbors are 1st node (val = 1) and 3rd node (val = 3).
    
    Example 2:
    Input: adjList = [[]]
    Output: [[]]
    Explanation: Note that the input contains one empty list. The graph consists of only one node with val = 1 and it does not have any neighbors.
    
    Example 3:
    Input: adjList = []
    Output: []
    Explanation: This an empty graph, it does not have any nodes.
    
    Example 4:
    Input: adjList = [[2],[1]]
    Output: [[2],[1]]
     
    
    Constraints:
    1 <= Node.val <= 100
    Node.val is unique for each node.
    Number of Nodes will not exceed 100.
    There is no repeated edges and no self-loops in the graph.
    The Graph is connected and all nodes can be visited starting from the given node.
    

      example1:

    example2:

    解法:BFS

    queue:<拷贝先res,拷贝元node>

    visited:处理过的节点map: key: node->val  value: Node*地址

    每次对处理对象节点->neighbors节点进行new

    (只有这些节点不存在在visited中的时候,若已存在,直接将visited里的地址赋值给neighbors)

    new完之后的neighbor节点,加入visited中。标记为已访问。

    代码参考:

     1 /*
     2 // Definition for a Node.
     3 class Node {
     4 public:
     5     int val;
     6     vector<Node*> neighbors;
     7     Node() {
     8         val = 0;
     9         neighbors = vector<Node*>();
    10     }
    11     Node(int _val) {
    12         val = _val;
    13         neighbors = vector<Node*>();
    14     }
    15     Node(int _val, vector<Node*> _neighbors) {
    16         val = _val;
    17         neighbors = _neighbors;
    18     }
    19 };
    20 */
    21 
    22 class Solution {
    23 public:
    24     Node* cloneGraph(Node* node) {
    25         Node* res;
    26         queue<vector<Node*>> q;
    27         if(node==nullptr) return nullptr;
    28         unordered_map<int, Node*> visited;
    29         if(node) {
    30             res = new Node(node->val);
    31             q.push({res,node});
    32             visited[node->val] = res;
    33         }
    34         while(!q.empty()) {
    35             int sz = q.size();
    36             for(int i=0; i<sz; i++) {
    37                 vector<Node*> cur = q.front();
    38                 q.pop();
    39                 for(Node* n:cur[1]->neighbors) {
    40                     if(visited.count(n->val)==0) {
    41                         Node* newnode = new Node(n->val);
    42                         visited[n->val] = newnode;
    43                         q.push({visited[n->val],n});
    44                     }
    45                     cur[0]->neighbors.push_back(visited[n->val]);
    46                 }
    47             }
    48         }
    49         return res;
    50     }
    51 };
  • 相关阅读:
    水煮栗子
    张至顺道长羽化登仙+说修行(道经每日清修)
    治疗口腔溃疡的穴位按摩方法
    一年四季的时令蔬菜水果表
    坐式养生八段锦口诀及练法图解
    SOA建设规划
    生鲜电商业务流程规划
    产品定义到产品推广的思路
    生鲜财务核算
    税率与存货、供应商关系
  • 原文地址:https://www.cnblogs.com/habibah-chang/p/14446807.html
Copyright © 2011-2022 走看看