C++中的树直径
假设我们有一个无向树;我们需要找到它的直径——树中最长路径中的边数就是该树的直径。这里树以边列表的形式给出,其中edges[i] = [u, v]是节点u和v之间的双向边。每个节点的标签都在集合{0, 1, ..., edges.length}中。所以如果图是这样的:

输出将是4。
为了解决这个问题,我们将遵循以下步骤:
- 定义一个映射l
- 定义一个名为dfs()的方法。它将接受v、一个名为visited的数组、图和c。它的工作原理如下:
- visited[v] := true,设置ans := 0
- 对于范围0到graph[v]大小的i
- 如果visited[graph[v, i]]为false,则
- ans := ans和dfs(graph[v, i], visited, graph, c + 1)中的最大值
- 如果visited[graph[v, i]]为false,则
- 如果c > best,则best := c且node := v
- 设置visited[v] := false
- 返回c和ans中的最大值
- 在主方法中,它将接受边列表e
- n := e的大小,创建一个大小为n + 1的数组graph
- 对于范围0到n – 1的i
- 将e[i, 1]插入graph[e[i, 0]]中,并将e[i, 0]插入graph[e[i, 1]]中
- 创建两个大小为n + 1的数组visited和visited2,设置best := 0和node := 0
- 调用dfs(0, visited, graph)
- 返回dfs(node, visited2, graph)
示例(C++)
让我们看看下面的实现,以便更好地理解:
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
class Solution {
public:
map <int ,int > l;
int best;
int node;
int dfs(int v, bool* visited, vector <int> graph[], int c = 0){
visited[v] = true;
int ans = 0;
for(int i = 0; i < graph[v].size(); i++){
if(!visited[graph[v][i]])ans = max(ans,dfs(graph[v][i], visited, graph, c+1));
}
if(c > best){
best = c;
node = v ;
}
visited[v] = false;
return max(c,ans);
}
int treeDiameter(vector<vector<int>>& e) {
int n = e.size();
vector <int> graph[n+1];
for(int i = 0; i < n; i++){
graph[e[i][0]].pb(e[i][1]);
graph[e[i][1]].pb(e[i][0]);
}
bool* visited = new bool[n+1]();
best = 0;
node = 0;
dfs(0, visited, graph);
bool* visited2 = new bool[n+1]();
return dfs(node, visited2, graph);
}
};
main(){
vector<vector<int>> v = {{0,1},{1,2},{2,3},{1,4},{4,5}};
Solution ob;
cout <<ob.treeDiameter(v);
}输入
[[0,1],[1,2],[2,3],[1,4],[4,5]]
输出
4
广告
数据结构
网络
关系数据库管理系统 (RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP