Leetcode Clone Graph

Clone Graph

Total Accepted:4360 Total Submissions:21850 My Submissions

Clone an undirected graph. Each node in the graph contains alabeland a list of itsneighbors.


OJ's undirected graph serialization:

Nodes are labeled uniquely.

We use #as a separator for each node, and ,as a separator for node label and each neighbor of the node.

As an example, consider the serialized graph{0,1,2#1,2#2,2}.

The graph has a total of three nodes, and therefore contains three parts as separated by#.

  1. First node is labeled as0. Connect node0to both nodes1and2.
  2. Second node is labeled as1. Connect node1to node2.
  3. Third node is labeled as2. Connect node2to node2(itself), thus forming a self-cycle.

Visually, the graph looks like the following:

       1
      / \
     /   \
    0 --- 2
         / \
         \_/


这里使用深度优先搜索。这样可以递归实现,如果是宽度优先,就要额外使用queue容器。

关键点:

1 这里的clone需要深度拷贝,就是要使用new操作了

2 防止回路无限循环,就要使用hash表,这里使用unordered_map记录访问过的节点。因为这里的label应该是唯一的才对,所以可以直接使用label作为关键字就可以。

看起来挺难的,因为图总给人困难的感觉,其实不难,3到4星级难度吧,很多都是基本操作组合起来。我一次性通过了。

struct UndirectedGraphNode 
{
	int label;
	vector<UndirectedGraphNode *> neighbors;
	UndirectedGraphNode(int x) : label(x) {};
};

class Solution 
{
public:
	UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) 
	{
		unordered_map<int, UndirectedGraphNode *> track;
		return cloneGraph(node, track);
	}

	UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node, unordered_map<int, UndirectedGraphNode *> &track) 
	{
		if (!node) return NULL;
		if (track.count(node->label)) return track[node->label];

		UndirectedGraphNode *new_node = new UndirectedGraphNode(node->label);
		new_node->neighbors.resize(node->neighbors.size());
		track[node->label] = new_node;

		for (int i = 0; i < node->neighbors.size(); i++)
		{
			new_node->neighbors[i] = cloneGraph(node->neighbors[i], track);
		}
		return new_node;
	}
};


//2014-2-18 update
	UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) 
	{
		unordered_map<int, UndirectedGraphNode *> ump_iu;
		return clone(node, ump_iu);
	}
	UndirectedGraphNode *clone(UndirectedGraphNode *n, 
		unordered_map<int, UndirectedGraphNode *> &ump_iu)
	{
		if (!n) return n;
		if (ump_iu.count(n->label)) return ump_iu[n->label];

		UndirectedGraphNode *rs = new UndirectedGraphNode(n->label);
		ump_iu[n->label] = rs;
		for (int i = 0; i < n->neighbors.size(); i++)
		{
			(rs->neighbors).push_back(clone((n->neighbors[i]), ump_iu));
		}
		return rs;
	}









**项目编号363:采用STM32微处理器的太阳能最大功率点追踪控制器研发(含完整电路设计文件程序源码)**最大功率点追踪(MPPT)是一种应用于太阳能控制器的关键技术,旨在通过动态调节光伏电池板的工作状态,使其持续运行于最大功率输出点。其基本原理基于电功率公式P=U×I,控制器通过实时调制电池板的端电压,进而改变输出电流,使得电压电流的乘积始终对应于光伏阵列特性曲线上的峰值功率位置。该技术仅适用于具备直流-直流变换功能的控制器架构,不适用于通过阵列投切方式工作的控制器类型。本设计方案以STM32系列微处理器为核心控制单元,构建了一套完整的太阳能MPPT控制系统。系统主要功能包括:- 对蓄电池进行多阶段充电管理,支持均衡充电、浮充充电及恒压充电等多种模式;- 采用可升降压的功率变换拓扑,实现对输入电压的灵活调整稳定输出;- 集成高精度电压采集模块,结合微处理器的智能控制算法,实现系统状态的实时监测反馈调节;- 内嵌高效的MPPT算法,能够根据环境光照温度变化自动追踪并锁定最佳功率点。本项目提供详细的电路原理图、印制电路板布局文件以及全部嵌入式软件源代码,可供后续开发、测试生产参考。资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值