首页 > 其他分享 >1617. 统计子树中城市之间最大距离

1617. 统计子树中城市之间最大距离

时间:2023-04-08 23:15:01浏览次数:49  
标签:子树 isVisit int 1617 子树中 距离 curTree max 节点

题目链接:1617. 统计子树中城市之间最大距离

方法:子集型回溯 + 判断连通 + 树的直径

解题思路

  1. 枚举所有可能的子树
    参考:子集型回溯
  2. 判断当前的子树是否合法,即当前树是否连通,通过\(dfs\)从某一个节点开始遍历子树,若遍历节点数量不等于子树节点数量,则不连通;
  3. 计算以每一个子树节点为起点能够到达的最远距离(通过\(dfs\)计算),取所有最远距离最大值

代码

class Solution {
public:
    vector<int> countSubgraphsForEachDiameter(int n, vector<vector<int>>& edges) {
        vector<int> ans(n - 1), curTree, isVisit(n), isSubTree(n);
        vector<vector<int>> g(n);
        int max_d = 0, d = 0, depth = 0, cnt = 0; 
        for (int i = 0; i < edges.size(); i ++ ) {
            int u = edges[i][0] - 1, v = edges[i][1] - 1;
            g[u].push_back(v), g[v].push_back(u);
        }
        // 判断当前子树是否合法
        function<void(int)> check = [&](int u) -> void {
            for (int v : g[u]) {
                if (isSubTree[v] && !isVisit[v]) {
                    isVisit[v] = true;
                    cnt ++ ;
                    check(v);
                }
            }
            return ;
        };
        // 计算当前子树直径,即城市之间的最大距离
        function<void(int)> dfs = [&](int u) -> void {
            for (int v : g[u]) {
                if (isSubTree[v] && !isVisit[v]) {
                    isVisit[v] = true;
                    depth ++ ;
                    dfs(v);
                    depth -- ;
                    isVisit[v] = false;
                }
            }
            d = max(depth, d);
            return ;
        };
        // 枚举子树
        function<void(int)> f = [&](int i) -> void { 
            int treeSize = curTree.size();
            if (treeSize > 1) {
                // 判断合法,通过一个节点能够遍历完所有当前子树节点,则表示合法
                fill(isVisit.begin(), isVisit.end(), 0);
                cnt = 1;
                isVisit[curTree[0]] = 1;
                check(curTree[0]);
                if (cnt == treeSize) { 
                    // 计算距离,计算以每一个子树节点为起点能够到达的最远距离,取所有最远距离最大值
                    max_d = 0;
                    for (auto &u : curTree) {
                        depth = -1, d = 0;
                        fill(isVisit.begin(), isVisit.end(), 0);
                        dfs(u);
                        max_d = max(max_d, d);
                    }
                    ans[max_d - 1] ++ ;
                }
            }
            if (i == n) return ;
            for (int j = i; j < n; j ++ ) {
                curTree.push_back(j);
                isSubTree[j] = true;
                f(j + 1);
                isSubTree[j] = false;
                curTree.pop_back();
            }
        };
        f(0);
        return ans;
    }
};

复杂度分析

时间复杂度分析:\(O(n*2^n)\),\(O(2^n)\):回溯枚举子树,\(O(n)\):判断 \(+\) 计算;
空间复杂度分析:\(O(n)\),\(edges.size() == n - 1\),那么每条边存储两次,\(O(n)\)。

标签:子树,isVisit,int,1617,子树中,距离,curTree,max,节点
From: https://www.cnblogs.com/lxycoding/p/17299496.html

相关文章

  • HJ52_计算字符串的编辑距离_动态规划_动态规划可视化
    思路:该题目符合最优解拥有最优子解,符合动态规划算法要求.2思路:操作方法有3种,替换、插入、删除。把a字符串编辑成b字符串的距离。3假设空字符串开始编辑作为bottom边界。4a字符串作为深度,b作为宽度。5沿宽度遍历为add,沿深度遍历为delete,斜角为change6判断是否相......
  • 计算两个概率分布之间的距离(Hellinger距离)
    Hellinger距离介绍Hellinger距离是一种用于度量概率分布之间相似度的指标。在统计学和信息论领域中,它被广泛应用于分类、聚类、图像识别、文本分类等方面。Hellinger距离又称为Bhattacharyya距离的平方根,它是两个概率分布之间的欧几里德距离的一半,其取值范围在0到1之间。和欧......
  • 1519. 子树中标签相同的节点数
    题目描述给了一些点的连通关系,每个点的值都不同,每个点上都哟一个附加的标签(小写字母)问:每个节点i的子树中标签和i相同的节点数f1-无向图后序遍历基本分析怎么根据连接关系进行遍历?先建图遍历的时候没有方向,怎么保证不会回去?加一个父节点的参数,保证不会往前走?怎么维护当前节......
  • 力扣612(MySQL)-平面上的最近距离(中等)
    题目:表point_2d保存了所有点(多于2个点)的坐标(x,y),这些点在平面上两两不重合。写一个查询语句找到两点之间的最近距离,保留2位小数。 最近距离在点(-1,-1)和(-1,2)之间,距离为1.00。所以输出应该为: 解题思路:建表语句:1createtableifnotexistspoint_2d(x......
  • AllJoyn:高通推出的近距离P2P通讯技术
    以NFC为代表的近距离无线通讯技术已经不是什么新鲜玩意了,而近场通讯的实用性和便利性,也使其成为业界一大热点,众多顶级公司都对这项技术寄予厚望,连全球最大的手机芯片制造商高通也推出了近距离P2P通讯技术AllJoyn,两台同样使用AllJoyn技术的设备可以快速实现......
  • #Python 利用python计算百度导航骑行距离(第二篇)批量计算
    https://www.cnblogs.com/simone331/p/17218019.html在上一篇中,我们计算了两点的距离(链接为上篇文章),但是具体业务中,往往会存在一次性计算多组,上百甚至上千的距离。所以......
  • Python小练习:向量之间的距离度量
    Python小练习:向量之间的距离度量作者:凯鲁嘎吉-博客园 http://www.cnblogs.com/kailugaji/本文主要用Python实现三种常见的向量之间的距离度量方式:1)曼哈顿距离(Manhat......
  • CAD动态块操作实例:距离乘数
    作为一名“成熟”的设计师,相信大家对于CAD动态块都不陌生,以下图为例,对部件左端进行拉伸,且拉伸后【键】仍处于部件左端的中心位置。今天,我们要用CAD动态块动作的【距离乘数......
  • Vue+Openlayers实现绘制线段并测量距离显示
    场景在上面已经实现交互式绘制线段基础上,怎样实现测量距离。注:关注公众号霸道的程序猿获取编程相关电子书、教程推送与免费下载。实现1、页面上添加按钮与map<template>......
  • 已知一点经纬度,方向角和距离,计算另一点的经纬度
    已知一点经纬度,方向角和距离,计算另一点的经纬度最近因为项目需要在地图上绘制小车的方向线,需要根据当前坐标和方向角计算当前方向上的另一个坐标点,下面是一个在Javascript......