0
点赞
收藏
分享

微信扫一扫

(每日一练java)CC18 复制无向图

elvinyang 2022-04-30 阅读 63

描述

本题要求复制一个无向图,图中每个节点都包含一个标签和它的邻居列表

我们无向图用以下的方法序列化:

  • 节点的标签是互不相同的,
  • 我们使用“#”作为节点之间的分隔符,使用“,”作为节点标签和节点的节点邻居的分隔符。

例如:现在有一个序列化的无向图{0,1,2#1,2#2,2}.

这个无向图一共有3个节点,因此序列被#分隔成三部分

  1. 第一个节点的标签是0,节点0和节点1,节点2之间有边
  2. 第二个节点的标签是1,节点1和节点2之间有边
  3. 第三个节点的标签是2,节点2和节点2(它自己)之间有边,形成了自环

这个无向图如下图所示

    //广度优先遍历	
    public UndirectedGraphNode cloneGraph(UndirectedGraphNode node) {
		if(node == null){
			return null;
		}
		Map<Integer, UndirectedGraphNode> nodeMap = new HashMap<Integer, UndirectedGraphNode>();
		Stack<UndirectedGraphNode> node_searched = new Stack<UndirectedGraphNode>();
		UndirectedGraphNode newNode = new UndirectedGraphNode(node.label);
		newNode.neighbors = node.neighbors;
		node_searched.push(newNode);
		nodeMap.put(newNode.label, newNode);
		while(!node_searched.empty()){
			UndirectedGraphNode curNode = node_searched.pop();
			for(UndirectedGraphNode curNeigh : curNode.neighbors){
				if(nodeMap.get(curNeigh.label) == null){
					UndirectedGraphNode copyNeigh = new UndirectedGraphNode(curNeigh.label);
					copyNeigh.neighbors = curNeigh.neighbors;
					node_searched.push(copyNeigh);
					nodeMap.put(copyNeigh.label, copyNeigh);
				}else{
					curNeigh = nodeMap.get(curNeigh.label);
				}
			}
		}
		return newNode;
	}

举报

相关推荐

0 条评论