专题4-图论和DFSBFS

Posted zqlucky

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了专题4-图论和DFSBFS相关的知识,希望对你有一定的参考价值。

1图论:

1.1  133. Clone Graph

https://leetcode.com/problems/clone-graph/#/description

思路:这题可以对照拷贝随机链表那道题,首先拷贝图中的节点,然后拷贝每个结点的neighbors数组。

这题使用BFS,所有的BFS都可以看成是queue和unordered_map的组合实现的,该题模拟实现了一个queue,主要是因为后面要判断某个元素是否已经访问,所以使用一个vector来模拟操作,传统的queue会弹出元素,还需要一个vector来辅助,比较麻烦。拷贝节点前要使用一个if(Map.find(cur -> neighbors[i]) == Map.end()),没找到才将元素复制到一个map里面,key是旧节点,value是新节点,记住因为是拷贝,所以新节点必须是new出来的节点,不然指针还是指向原来的元素,出错。后面拷贝neighbor数组的时候也要注意这点,必须将map中的value当成拷贝数组中的元素(这点很重要)。 Map[qNode[j]] -> neighbors.push_back(  Map[  qNode[j] -> neighbors[k] ]  );

map操作总结:

插入使用insert函数,查找每个元素是否在map里面,使用map.find(),如果没找到就对应的指针指向map.end();

使用下标操作找到对应的value,如果需要找的key不在map里面,就会自动将可以保存起来,默认初始化,比如map里面没有1,执行下标操作map[1]之后,map里面就会有 1.

insert插入和make_pair组合使用。

技术分享
/**
 * Definition for undirected graph.
 * struct UndirectedGraphNode {
 *     int label;
 *     vector<UndirectedGraphNode *> neighbors;
 *     UndirectedGraphNode(int x) : label(x) {};
 * };
 */
class Solution {
public:
    UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {
        if(node == NULL){
            return NULL;
        }
        vector<UndirectedGraphNode *> qNode;
        unordered_map<UndirectedGraphNode *,UndirectedGraphNode *> Map;
        qNode.push_back(node);
        Map.insert(make_pair(node,new UndirectedGraphNode(node -> label)));
        int start = 0;
        //clone nodes
        while(start < qNode.size()){
            UndirectedGraphNode *cur = qNode[start];
            for(int i= 0;i < cur -> neighbors.size();++i){
                if(Map.find(cur -> neighbors[i]) == Map.end()){
                    qNode.push_back(cur -> neighbors[i]);
                    Map.insert(make_pair(cur -> neighbors[i],
                                         new UndirectedGraphNode(cur -> neighbors[i] -> label))); 
                  
                }
               
            }
            ++start;
        }
        
       // clone neighbors
        for(int j = 0;j < qNode.size();++j){
            for(int k = 0;k < qNode[j] -> neighbors.size();++k){
               // UndirectedGraphNode *tmp = new UndirectedGraphNode(qNode[j] -> neighbors[k] -> label);
                Map[qNode[j]] -> neighbors.push_back(Map[qNode[j] -> neighbors[k]]);
            }
        }
        return Map[node];
        
    }
};
clone graph

 

以上是关于专题4-图论和DFSBFS的主要内容,如果未能解决你的问题,请参考以下文章

基于图论和人工神经网络的供水管网漏损检测方法(上)

Holiday15

省选图论专题

假期计划

ACM算法与竞赛协会第二次培训-图论-代码与题目汇总

ACM算法与竞赛协会第二次培训-图论-代码与题目汇总