• leetcode Ch7-Graph Search


     1. Clone Graph

    BFS:

     1 class Solution {
     2 public:
     3     typedef UndirectedGraphNode UGNode;
     4     UndirectedGraphNode* cloneGraph(UndirectedGraphNode* node) {
     5         if (node == NULL) {
     6             return NULL;
     7         }
     8         vector<UGNode*> nodes;
     9         unordered_map<UGNode*, UGNode*> umap;
    10         
    11         //clone nodes only
    12         nodes.push_back(node);
    13         umap[node] = new UGNode(node->label);
    14         int start = 0;
    15         while (start < nodes.size()) {
    16             UGNode* tmp = nodes[start];
    17             start++;
    18             for (int i = 0; i < tmp->neighbors.size(); i++) {
    19                 if (umap.count(tmp->neighbors[i]) == 0) {
    20                     nodes.push_back(tmp->neighbors[i]);
    21                     umap[tmp->neighbors[i]] = new UGNode(tmp->neighbors[i]->label);
    22                 }
    23             }
    24         }
    25         
    26         //clone neighbors only
    27         for (int i = 0; i < nodes.size(); i++) {
    28             UGNode* newNode = umap[nodes[i]];
    29             for (int j = 0; j < nodes[i]->neighbors.size(); j++) {
    30                 newNode->neighbors.push_back(umap[nodes[i]->neighbors[j]]);    
    31             }
    32         }
    33         return umap[node];
    34     }
    35 };
    View Code

    DFS:

     1 class Solution {
     2 public:
     3     typedef UndirectedGraphNode UGNode;
     4     UndirectedGraphNode* cloneGraph(UndirectedGraphNode* node) {
     5         if (node == NULL) {
     6             return NULL;
     7         }
     8         return dfs(node);
     9     }
    10     
    11     UGNode* dfs(UGNode* node) {
    12         UGNode* p = new UGNode(node->label);
    13         umap[p->label] = p;
    14         for (int i = 0; i < node->neighbors.size(); i++) {
    15             if (umap.count(node->neighbors[i]->label) == 0) {
    16                 p->neighbors.push_back(dfs(node->neighbors[i]));
    17             } else {
    18                 p->neighbors.push_back(umap[node->neighbors[i]->label]);
    19             }
    20         }
    21         return p;
    22     }
    23 private:
    24     unordered_map<int, UGNode*> umap;
    25 };
    View Code

    这里umap里的second存的都是copy后的图节点,不是原图。

    图的邻接表DFS:

     1 struct VertexNode {
     2     int data;
     3     EdgeNode* next;
     4 };
     5 
     6 struct EdgeNode {
     7     int index; // 存储其对应的点的下标
     8     EdgeNode* next;
     9 };
    10 
    11 struct Graph {
    12     VertexNode vexs[MAXVEX];
    13     int numVertex;
    14 };
    15 
    16 vector<bool> visited;
    17 
    18 void dfs(Graph* g, int i) {
    19     visited[i] = 1;
    20     print(g, i);
    21     EdgeNode* p = g->vexs[i]->next;
    22     while (p) {
    23         if (!visited[p->index]) {
    24             dfs(g, p->index);
    25         }
    26         p = p->next;
    27     }
    28 }
    29 
    30 void dfsTraverse(Graph* g) {
    31     for (int i = 0; i < g->numVertex; i++) {
    32         if (!visited[i]) {
    33             dfs(g, i);
    34         }
    35     }
    36 }
    View Code

    图的邻接表BFS:

     1 void bfsTraverse(Graph* g) {
     2     queue<int> q;
     3     for (int i = 0; i < numVertex; i++) {
     4         if (!visited[i]) {
     5             visited[i] = 1;
     6             print(g, i);
     7             q.push(i);
     8             while (!q.empty()) {    
     9                 int j = q.top();
    10                 q.pop();
    11                 EdgeNode* p = g->vexs[j].next;
    12                 while (p) {
    13                     if (!visited[p->index]) {
    14                         visited[p->index] = 1;
    15                         print(g, p->index);
    16                         q.push(p->index);
    17                     }
    18                     p = p->next;
    19                 }
    20             }
    21         }
    22     }
    23 }
    View Code
  • 相关阅读:
    (转)golang获取当前时间、时间戳和时间字符串及它们之间的相互转换
    FFmpeg常用命令
    go cmd nohup 的坑
    Nginx配置详解(转)
    记录一次go性能调试的过程
    github徽标引入
    golang 关于 interface 的学习整理
    <转>Go语言TCP Socket编程
    [转]Go里面的unsafe包详解
    linux extglob模式 和rm反选
  • 原文地址:https://www.cnblogs.com/forcheryl/p/4691787.html
Copyright © 2020-2023  润新知