力扣练习——49 最小高度树

给定一个具有树特征的无向图,找到使树具有最小高度的根节点。返回所有最小高度树的根节点编号,按升序排列。例如,对于4个节点和3条边的图,最小高度树的根节点可能是1;对于6个节点和5条边的图,最小高度树的根节点可能是3或4。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

49 最小高度树

1.问题描述
对于一个具有树特征的无向图,我们可选择任何一个节点作为根。图因此可以成为树,在所有可能的树中,具有最小高度的树被称为最小高度树。给出这样的一个图,写出一个函数找到所有的最小高度树并返回他们的根节点。

该图包含 n 个节点,标记为 0 到 n - 1。给定数字 n 和一个无向边 edges 列表(每一个边都是一对标签)。

你可以假设没有重复的边会出现在 edges 中。由于所有的边都是无向边, [0, 1]和 [1, 0] 是相同的,因此不会同时出现在 edges 里。

示例 1:

n = 4, edges = [[1, 0], [1, 2], [1, 3]]

    0

    |

    1

   / \

  2   3 

输入:

4

1 0

1 2

1 3

输出: 1

示例 2:

n = 6, edges = [[0, 3], [1, 3], [2, 3], [4, 3], [5, 4]]

 0  1  2

  \ | /

    3

    |

    4

    |

    5 

输入:

6

0 3

1 3

2 3

4 3

5 4

输出: 3 4

说明:

根据树的定义,树是一个无向图,其中任何两个顶点只通过一条路径连接。 换句话说,一个任何没有简单环路的连通图都是一棵树。

树的高度是指根节点和叶子节点之间最长向下路径上边的数量。

可使用以下main函数:

int main()

{

int n;

vector<vector<int> > edges;

cin>>n;

int p1,p2;

for(int i=0; i<n-1; i++)//边的数目为节点数目减1

{

    cin>>p1>>p2;

    vector<int> edge;

    edge.push_back(p1);

    edge.push_back(p2);

    edges.push_back(edge);

}

vector<int> res=Solution().findMinHeightTrees(n, edges);

sort(res.begin(), res.end());

for(int i=0; i<res.size(); i++)

cout<<res[i]<<" ";

}
2.输入说明
首先输入节点的个数n,

然后输入n-1行(n个节点存在n-1条边),每行两个整数ai,、bi,表示节点ai和节点bi之间存在一条边,ai和bi不相同。

n<=20000

0 <= ai, bi < n

ai != bi

所有 (ai, bi) 互不相同

给定的输入 保证 是一棵树,并且 不会有重复的边
3.输出说明
对于所有找到的根节点,按照编号从小到大的顺序输出,每个编号后跟一个空格。
4.范例
输入
6
0 3
1 3
2 3
4 3
5 4
输出
3 4
5.代码

#include <iostream>
#include <queue>
#include <cstdlib>
#include <cstring>
#include<map>
#include<vector>
#include<algorithm>
using namespace std;

vector<int> findMinHeightTrees(int n, vector<vector<int> > edges)
{
	//树的高度是指根节点和叶子节点之间最长向下路径上边的数量,要求输出最小高度树的根节点
	//对于所有找到的根节点,按照编号从小到大的顺序输出,每个编号后跟一个空格。
	//输入n,则总共n个节点,编号从0到n-1
	//参考网址:https://leetcode.cn/problems/minimum-height-trees/solution/zui-rong-yi-li-jie-de-bfsfen-xi-jian-dan-zhu-shi-x/

	if (n == 1)
		return { 0 };//只有一个节点,编号为0,该节点就是满足的根节点
	vector<int>degrees(n);//总共n个节点,下标从0到n-1,分别代表图上面的点
	vector<int>res;//定义结果
	map<int, vector<int>>mm;//定义邻接表
	//记录邻接表
	for (int i = 0; i < edges.size(); i++)
	{
		//因为是无向图,所以邻接表需要分别记录起点和终点的邻接情况
		int u = edges[i][0];//边起点
		int v = edges[i][1];//边终点
		degrees[u]++;//该节点的出现次数加1
		degrees[v]++;
		mm[u].push_back(v);//u和v是邻接点,有边相连
		mm[v].push_back(u);
	}
	//将叶子节点先入队
	queue<int>q;
	for (int i = 0; i < n; i++)
	{
		if (degrees[i] == 1)//只出现一次,说明是叶子节点
			q.push(i);
	}
	//BFS过程
	//从叶子节点开始朝内部遍历,寻找两边同时从中间靠拢的节点,将圈子一圈圈缩小
	//这里对示例的理解要透彻,一个无向图,所有当前的出度为0的节点【相当于叶子节点,也就是现在队列中保存的】都进行依次遍历,然后将其删去,得到新的图【原图缩小】,将叶子节点重新加入
	//剩下的最后一次保留的叶子节点就是所要求的树的根节点
	while (!q.empty())
	{
		res.clear();//每层遍历结束都要清空结果
		int size = q.size();
		for (int i = 0; i < size; i++)
		{
			int num = q.front();//头节点
			q.pop();//出队列,类似于删除已经遍历的结点
			res.push_back(num);//加入结果中
			degrees[num]--;//更新
			//对当前节点的邻接点进行访问
			for (auto j : mm[num])//访问map中与之相邻的结点
			{
				degrees[j]--;//在删除更新
				if (degrees[j] == 1)//若删除前一个结点后,与之相邻的结点变成叶子节点,就入队
					q.push(j);//注意,这里是新一轮BFS的起点
			}
		}

	}

	return res;//返回最后一次保留的叶子节点,这里的res是无序的,后面输出的时候用了sort(),才实现题目要求的从小到大输出

}

int main()

{

	int n;

	vector<vector<int> > edges;

	cin >> n;

	int p1, p2;

	for (int i = 0; i < n - 1; i++)//边的数目为节点数目减1

	{

		cin >> p1 >> p2;

		vector<int> edge;

		edge.push_back(p1);

		edge.push_back(p2);

		edges.push_back(edge);

	}

	vector<int> res = findMinHeightTrees(n, edges);//注:这里返回的vector是无序的

	sort(res.begin(), res.end());//先进行排序,然后再输出

	for (int i = 0; i < res.size(); i++)

		cout << res[i] << " ";

}
### 关于ArcGIS License Server无法启动的解决方案 当遇到ArcGIS License Server无法启动的情况,可以从以下几个方面排查并解决问题: #### 1. **检查网络配置** 确保License Server所在的计算机能够被其他客户端正常访问。如果是在局域网环境中部署了ArcGIS Server Local,则需要确认该环境下的网络设置是否允许远程连接AO组件[^1]。 #### 2. **验证服务状态** 检查ArcGIS Server Object Manager (SOM) 的运行情况。通常情况下,在Host SOM机器上需将此服务更改为由本地系统账户登录,并重启相关服务来恢复其正常工作流程[^2]。 #### 3. **审查日志文件** 查看ArcGIS License Manager的日志记录,寻找任何可能指示错误原因的信息。这些日志可以帮助识别具体是什么阻止了许可服务器的成功初始化。 #### 4. **权限问题** 确认用于启动ArcGIS License Server的服务账号具有足够的权限执行所需操作。这包括但不限于读取/写入特定目录的权利以及与其他必要进程通信的能力。 #### 5. **软件版本兼容性** 保证所使用的ArcGIS产品及其依赖项之间存在良好的版本匹配度。不一致可能会导致意外行为完全失败激活license server的功能。 #### 示例代码片段:修改服务登录身份 以下是更改Windows服务登录凭据的一个简单PowerShell脚本例子: ```powershell $serviceName = "ArcGISServerObjectManager" $newUsername = ".\LocalSystemUser" # 替换为实际用户名 $newPassword = ConvertTo-SecureString "" -AsPlainText -Force Set-Service -Name $serviceName -StartupType Automatic New-ServiceCredential -ServiceName $serviceName -Account $newUsername -Password $newPassword Restart-Service -Name $serviceName ``` 上述脚本仅作为示范用途,请依据实际情况调整参数值后再实施。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值