精华内容
下载资源
问答
  • 用matlab一个圆的直径半径,做好边缘检测,找出最左最右的两个点,距离除以二就是半径啊,圆心就是这两个点连线的中点,
  • 使用Floyd算法图求直径

    千次阅读 2019-03-08 21:40:58
    https://www.cnblogs.com/Ran-Chen/p/9219716.html
    展开全文
  • 1. 定义邻接表存储的类。 2. 实验验证如下算法的正确性、各种功能及指标: 1) 创建一个邻接表存储的; 2) 返回中指定边的权值; 3)插入操作:向中插入一条边;...设计并实现一个算法,自由树的直径
  • 树形dp直径:#include#include#define ll long longusing namespace std;const int N=100010,M=1000010;int head[N];int ver[M];int edge[M];int Next[M];bool v[N];int tot;void add(int x,int y,int z){ver[++...

    树形dp求树直径:

    #include#include#define ll long long

    using namespace std;

    const int N=100010,M=1000010;

    int head[N];

    int ver[M];

    int edge[M];

    int Next[M];

    bool v[N];

    int tot;

    void add(int x,int y,int z)

    {

    ver[++tot]=y;

    edge[tot]=z;

    Next[tot]=head[x];

    head[x]=tot;

    }

    ll ans;

    int d[N];//以N为根节点在其子树的最长路

    void dp(int x)//根节点

    {

    v[x]=1;

    for(int i=head[x];i;i=Next[i])

    {

    int y=ver[i];

    if(v[y])continue;

    dp(y);

    if(d[x]+d[y]+edge[i]>ans)ans=d[x]+d[y]+edge[i];//这两个if的顺序不要弄错

    if(d[y]+edge[i]>d[x])d[x]=d[y]+edge[i];//

    }

    }

    int main()

    {

    int n;//节点数

    int m;//边数

    while(cin>>n>>m)

    {

    ans=-9999999999;

    for(int i=1;i<=m;++i)

    {

    int x,y,z;

    cin>>x>>y>>z;

    add(x,y,z);

    add(y,x,z);

    }

    dp(1);

    cout<

    两次dfs求树直径:

    #include#define ll long long

    using namespace std;

    const int N=100010,M=1000010;

    int head[N];

    int ver[M];

    int edge[M];

    int Next[M];

    int tot;

    priority_queue< pair>Q;

    void add(int x,int y,int z)

    {

    ver[++tot]=y;

    edge[tot]=z;

    Next[tot]=head[x];

    head[x]=tot;

    }

    ll ans;//记录最深的点的节点标号;

    int d[N];//以N为根节点的子树的深度;

    bool v[N];//无向图防止子节点回到父节点

    void dfs(int x)

    {

    v[x]=1;

    for(int i=head[x];i;i=Next[i])

    {

    int y=ver[i];

    if(v[y])continue;

    d[y]=d[x]+1;//从上往下加一即可;

    if(d[y]>d[ans])ans=y;

    dfs(y);

    }

    }

    int main()

    {

    int n;//节点数

    int m;//边数

    while(cin>>n>>m)

    {

    ans=0;

    d[0]=0;

    for(int i=1;i<=m;++i)

    {

    int x,y,z;

    cin>>x>>y>>z;

    add(x,y,z);

    add(y,x,z);

    }

    dfs(1);

    memset(d,0,sizeof(d));//两次dfs注意清空搜索标记数组、子树深度数组d;

    memset(v,0,sizeof(v));

    //cout<

    展开全文
  • 从任意一点出发,找到离该点距离最大的点,即为直径的一个端点。然后再从这个点出发,找到离这个点距离最大的点。这两个点的距离即为直径。 二、例题:大臣的旅费 很久以前,T王国空前繁荣。 为了更好地管理国家,...

    一、思路
    从任意一点出发,找到离该点距离最大的点,即为直径的一个端点。然后再从这个点出发,找到离这个点距离最大的点。这两个点的距离即为直径。

    二、例题:大臣的旅费
    很久以前,T王国空前繁荣。

    为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国内的各大城市。

    为节省经费,T国的大臣们经过思考,制定了一套优秀的修建方案,使得任何一个大城市都能从首都直接或者通过其他大城市间接到达。

    同时,如果不重复经过大城市,从首都到达每个大城市的方案都是唯一的。

    J是T国重要大臣,他巡查于各大城市之间,体察民情。

    所以,从一个城市马不停蹄地到另一个城市成了J最常做的事情。

    他有一个钱袋,用于存放往来城市间的路费。

    聪明的J发现,如果不在某个城市停下来修整,在连续行进过程中,他所花的路费与他已走过的距离有关,在走第x千米到第x+1千米这一千米中(x是整数),他花费的路费是x+10这么多。也就是说走1千米花费11,走2千米要花费23。

    J大臣想知道:他从某一个城市出发,中间不休息,到达另一个城市,所有可能花费的路费中最多是多少呢?

    输入格式
    输入的第一行包含一个整数 n,表示包括首都在内的T王国的城市数。

    城市从 1 开始依次编号,1 号城市为首都。

    接下来 n−1 行,描述T国的高速路(T国的高速路一定是 n−1 条)。

    每行三个整数 Pi,Qi,Di,表示城市 Pi 和城市 Qi 之间有一条双向高速路,长度为 Di 千米。

    输出格式
    输出一个整数,表示大臣J最多花费的路费是多少。

    数据范围
    1≤n≤105,
    1≤Pi,Qi≤n,
    1≤Di≤1000
    输入样例:
    5
    1 2 2
    1 3 1
    2 4 5
    2 5 4
    输出样例:
    135

    裸题,思路如上

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    
    using namespace std;
    
    const int N = 100010;
    
    int h[N], e[2 * N], dis[2 * N], ne[2 * N], idx;
    int n;
    int d[N];
    
    void add(int a, int b, int w)
    {
        e[idx] = b;
        dis[idx] = w;
        ne[idx] = h[a];
        h[a] = idx++;
    }
    
    void dfs(int u, int father, int distance)
    {
        d[u] = distance;
        
        for(int i = h[u]; i != -1; i = ne[i])
        {
            int j = e[i];
            if(j != father)
                dfs(j, u, distance + dis[i]);
        }
    }
    
    int main()
    {
        cin >> n;
        
        memset(h, -1, sizeof h);
        
        for(int i = 0; i < n; i++)
        {
            int a, b, w;
            cin >> a >> b >> w;
            
            add(a, b, w);
            add(b, a, w);
        }
        
        dfs(1, -1, 0);
        
        int u = 1;
        for(int i = 2; i <= n; i++)
            if(d[i] > d[u]) u = i;
        
        dfs(u, -1, 0);
        
        int s = 0;
        for(int i = 1; i <= n; i++)
            if(d[i] > s) s = d[i];
        
        printf("%lld\n", s * 10 + s * (s + 1ll) / 2);
        return 0;
    } 
    
    展开全文
  • 树形dp树的直径

    2021-05-04 14:16:28
    引言 很久之前看过树的直径这个问题,但是那时还看不太懂实现方法。后来学会了树形dp,偶然间又在leetcode上刷了两个有关二叉树的题,发现和树的直径这个问题很相似,只是把树特殊化成了二叉树,然后加了一些...

    所有文字著作权归本人所有,禁止转载抄袭!如有错误,欢迎指正!

    引言

    很久之前看过求树的直径这个问题,但是那时还看不太懂实现方法。后来学会了树形dp,偶然间又在leetcode上刷了两个有关二叉树的题,发现和求树的直径这个问题很相似,只是把树特殊化成了二叉树,然后加了一些变化。原本写这篇总结时想先引入那两个简单题,再过渡到树的直径这个问题。但是想想那两个题并非是“严格的”求解树的直径的问题。这样做对于讲树的直径来说就本末倒置了。故本篇总结先讲解树的直径问题,最后附上两个简单题有助于对比理解。

    【模板题】树的直径


    题目描述:
    题目链接 洛谷U81904 树的直径
    给定一棵树,树中每条边都有一个权值,
    树中两点之间的距离定义为连接两点的路径边权之和。
    树中最远的两个节点之间的距离被称为树的直径,连接这两点的路径被称为树的最长链。
    现在让你求出树的最长链的距离
    题意总结:求树上距离最远的两个节点间的距离
    输入格式
    给定一棵无根树
    第一行为一个正整数n,表示这颗树有n个节点
    接下来的n−1行,每行三个正整数u,v,表示u,v(u,v<=n)有一条权值为w的边相连
    数据保证没有重边或自环
    输出格式
    输入仅一行,表示树的最长链的距离
    输入输出样例
    输入
    6
    1 2 1
    1 3 2
    2 4 3
    4 5 1
    3 6 2
    输出
    9

    说明/提示
    对于100%的数据 n<=500000 边权可能为负

    树形dp解法

    一.什么是树形dp?
    树形dp就是在树结构上所做的动态规划,通常树形dp是基于dfs来实现的。在用dfs遍历节点并维护信息的时候采用“后序”的思想:对于每个节点,都要用其所有儿子节点的信息来更新它自身的信息,只有当所有儿子节点的信息都得到确认之后,父节点的信息才能得到确认。基于这种“后序”的思想,树形dp通常具有如下结构:

    / /树形dp结构伪代码描述
    void dfs(节点u){
         for(){   / /循环访问所有u的子节点
         dfs(u的子节点);
         用u的子节点信息更新节点u的信息;
         }
    }
    

    二.用树形dp求树的直径:
     既然是树形动态规划,我们就尝试用上面树形dp的框架来解决问题。
    1.首先,要确定维护的信息是什么?
         假设当前父节点 u u u, u u u的所有儿子节点为 v 1 , . . . , v n v_{1},...,v_{n} v1,...,vn,那么这个信息必然要满足“只要知道了儿子节点 v 1 , . . . , v n v_{1},...,v_{n} v1,...,vn的该信息,就能确定u的该信息”。由于最终要求树上最远两个节点的距离,不妨做这样的定义:设d[x]为节点x到其子孙节点的最大距离、设f[x]为以x为根结点的一条最长路径的距离。即要维护的信息就是d[],f[]。

    2.如何维护上述信息?
    (1)假设当前遍历到的节点是u,u的子节点是 v 1 , . . . , v n v_{1},...,v_{n} v1,...,vn,对应的边权是 w 1 , . . . , w n w_1,...,w_n w1,...,wn.依据树形dp的“后序”思想,继续假设已经求得了u的所有子节点 v 1 , . . . , v n v_{1},...,v_{n} v1,...,vn到其子孙节点的最大距离d[ v 1 v_{1} v1],…,d[ v n v_n vn]。已知信息画成下图,其中红色箭头所示的边为虚拟的边,也可看成是一条路径。
    图1(2)根据已知信息求d[u]:若边权都是正值,则d[u]=max(d[ v 1 v_1 v1]+ w 1 w_{1} w1,d[ v 2 v_2 v2]+ w 2 w_{2} w2,…,d[ w n w_n wn+ w n w_n wn]),若存在负的权值,则d[u]=max(0, w 1 w_1 w1,d[ v 1 v_1 v1]+ w 1 w_{1} w1, w 2 w_2 w2,d[ v 2 v_2 v2]+ w 2 w_{2} w2,…, w n w_n wn,d[ v n v_n vn]+ w n w_n wn),可见d[u]>=0。

    (3)确定f[u]的值:若边权都是正值,则f[u]=(d[ v x v_x vx]+ w x w_x wx)+(d[ v y v_y vy]+ w y w_y wy),其中(d[ v x v_x vx]+ w x w_x wx)和(d[ v y v_y vy]+ w y w_y wy)分别是u能到达子孙节点的最远距离和次远距离。即f[u]=d[u]+(d[ v y v_y vy]+ w y w_y wy)。若存在负的权值,则f[u]=max(0,d[u]+d[ v y v_y vy]+ w y w_y wy,d[u]+max( w 1 w_1 w1,…, w x − 1 w_{x-1} wx1, w x + 1 w_{x+1} wx+1, w n w_n wn)),其中d[u]=d[ v x v_x vx]+ w x w_x wx,可见f[u]>=0。 说句人话就是:当权值为正值时,选择以u为根节点的两条最长路径和次长路径相加,得到以u为根结点的最长路径值。当权值存在负值时,就在下面两种组合中选择一个最大值:<1>最长路径+次长路径 <2>最长路径+某一条边
    3.确定整棵树的最大距离res:res=max(f[1],…,f[n])。
    4.正确性证明:
      可以想象,最长的路径构成的子树必然有且仅有一个根,即最靠近整棵树的根的那个节点。上述算法遍历了整棵树,求得了以所有节点为根结点的最长路径,而整棵树的最长路径有且仅有一个根,必然包含在“以所有节点为根结点的最长路径”中。 换句话说,假设我们在树上标出这条最短路,这条最短路必然有且仅有一个根节点。而遍历树的时候也必然会遍历到这个根节点并求出这个节点的“以该节点为根的最长路径”并放到f[]数组中,在f[]中找个最大值不就找到了。
    5.总结:整个算法的思想就是假设当前节点就是最长路径的根,并求得以当前节点x为根的最长路径f[x]。最后在分别以节点1,…,n为根节点的最长路径 f[1],…,f[n]中选择一条最长的即可。
      最后两条描述可以结合下面的图来理解,假设图中连接a和b的路径是树的最长链,这条路径有且仅有一个根节点u(u是这条路径上离root最近的节点)。其它每个节点充当根结点时都对应一个“局部的最长路”,比如图中连接z和y的路径是以x为根节点的局部最长路,只是没有a->b长而已。
    在这里插入图片描述6.核心代码:分两种写法,第一种严格按上面的描述定义变量。第二种写法只是第一种的改版——让dfs返回变量d,并在在遍历时更新res。附上第二种写法的目的在于对比后面两个leetcode题的解法。

    / /树形dp解树的直径的两种写法:
    
     / /第一种写法
    int vis[N];
    int  res=INT_MIN;   / /初始为一个很小的值
    
    int d[N],f[N];
    void dfs(int u){
        vis[u]=1;
       for(int i=head[u];i>=0;i=e[i].next){   //遍历u的出边
        int v=e[i].v;
        int w=e[i].w;
        if(!vis[v]){   //如果时u的子节点
          dfs(v);        
          f[u]=max(max(f[u],d[u]),max(d[v]+w,d[u]+d[v]+w));
          d[u]=max(max(d[u],w),d[v]+w);
        }
       }
    }
    
    dfs(1);
    for(int i=1;i<=n;i++) res=max(res,f[i]);
    printf("%d\n",res);
    
    
    / /第二种写法:
    int vis[N];
    int  res=INT_MIN;
    int dfs(int u){
        vis[u]=1;
        int ud=0;
       for(int i=head[u];i>=0;i=e[i].next){
        int v=e[i].v;
        int w=e[i].w;
        if(!vis[v]){
          int vd=dfs(v);
          res=max(max(res,ud),max(vd+w,ud+vd+w));
          ud=max(max(ud,w),vd+w);
        }
       }
    return ud;
    }
    
    
    

    本题完整C++代码

    //C++代码
    //采用链式前向星存图
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<climits>
    using namespace std;
    const int N=5e5+100;
    struct edge{
    int u;
    int v;
    int w;
    int next;
    }e[2*N];
    
    int head[N],cnt=0;
    void Insert(int u,int v,int w){
    cnt++;
    e[cnt].u=u;
    e[cnt].v=v;
    e[cnt].w=w;
    e[cnt].next=head[u];
    head[u]=cnt;
    }
    
    int vis[N];
    int  res=INT_MIN;
    
    int d[N],f[N];
    void dfs(int u){
        vis[u]=1;
       for(int i=head[u];i>=0;i=e[i].next){
        int v=e[i].v;
        int w=e[i].w;
        if(!vis[v]){
          dfs(v);
          f[u]=max(max(f[u],d[u]),max(d[v]+w,d[u]+d[v]+w));
          d[u]=max(max(d[u],w),d[v]+w);
        }
       }
    }
    int main(){
        memset(head,-1,sizeof(head));
    int n;
    scanf("%d",&n);
    int u,v,w;
    for(int i=1;i<=n-1;i++){
        scanf("%d%d%d",&u,&v,&w);
        Insert(u,v,w);
        Insert(v,u,w);
    }
    
    dfs(1);
    for(int i=1;i<=n;i++) res=max(res,f[i]);
    printf("%d\n",res);
    return 0;
    }
    
    
    

    leetcode变形题一

    题目链接:124. 二叉树中的最大路径和
    路径被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径至少包含一个 节点,且不一定经过根节点。
    路径和是路径中各节点值的总和。
    给你一个二叉树的根节点 root ,返回其 最大路径和 。

    示例 1:

    在这里插入图片描述
    输入:root = [1,2,3]
    输出:6
    解释:最优路径是 2 -> 1 -> 3 ,路径和为 2 + 1 + 3 = 6

    示例 2:
    在这里插入图片描述
    输入:root = [-10,9,20,null,null,15,7]
    输出:42
    解释:最优路径是 15 -> 20 -> 7 ,路径和为 15 + 20 + 7 = 42

    提示:
    树中节点数目范围是 [1, 3 * 104], -1000 <= Node.val <= 1000

    分析

    模板题中的路径和是路径上边的权值,而此处是路径上点的权值。

    C++代码

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
     *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
     *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
     * };
     */
     
    
    class Solution {
    private:
    int res=INT_MIN;  
    public:
        int dfs(TreeNode *root){
        if(root==nullptr) return 0;    
        int d=root->val;
        int l=dfs(root->left);
        int r=dfs(root->right);
        res=max(max(res,d+l+r),max(d,max(d+r,d+l)));
        d=max(d,max(d+l,d+r));
        return d;   //返回  以当前节点为根的到达子孙节点的最长路径和
        }
        int maxPathSum(TreeNode* root) {
        dfs(root);
        return res; 
        }
    };
    

    leetcode变形题二(更简单)

    题目链接:leetcode 543. 二叉树的直径

    给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。
    示例 :
    给定二叉树

          1
         / \
        2   3
       / \     
      4   5    
    

    返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。

    注意:两结点之间的路径长度是以它们之间边的数目表示。

    分析

    路径长度改成路径上边的数目。

    C++代码

    
    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
     *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
     *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
     * };
     */
    class Solution {
    private:
    int res=INT_MIN;   
    public:
        int dfs(TreeNode* root){
             if(root==nullptr) return 0;
             int d=0;
             int l=dfs(root->left);
             int r=dfs(root->right);
             d=max(l+1,r+1);
             res=max(res,l+r);
             return d; 
        }
        int diameterOfBinaryTree(TreeNode* root) {
        dfs(root);
        return res;
        }
    };
    
    
    
    
    
    
    
    展开全文
  • 树的直径两种

    2021-07-26 08:54:52
    首先先介绍一下什么是树的直径,树的直径...先从上任意一点,搜索整棵树,找到距离该点最远的点,再用距离该点最远的点搜索一次,即可得到树的直径。 证明我就不写了,给出一位大佬的博客地址,里面有很详细的证明 ...
  • 两次bfs树的直径

    2021-09-30 15:38:04
    两次bfs树的直径 方法:先从任意一点R出发,找离它最远的点S,再从点S出发,找离它最远的点T,S到T的距离就是是的直径。 ** ** 算法证明: ①若R已经在直径上,根据树的直径的定义可知S也在直径上且为直径的一个...
  • 学习树的直径前提须知 树的直径 是一棵树的某两个最深的叶子节点的连线,多用于与图论算法嵌套考 算法内容 竞赛需要用到的点 1、很简单的算法,不会单独考,学习和熟练使用它的多种情况 树的直径略讲 很简单,两次...
  • a到b,b到a,ab互相到达。这三个条件满足一个即可...之后分别以各个点为起点,最长直径即可。出最大值来。 #include  #include  #include  #include  #include  using namespace std;
  • 图直径问题

    千次阅读 2020-03-26 16:52:20
    题目要求 实验室里原先有一台电脑(编号为1),最近氪金带师咕咕东又为实验室购置了N-1台电脑,编号为2到...提示: 样例输入对应这个,从这个中你可以看出,距离1号电脑最远的电脑是4号电脑,他们之间的距离是3。 4...
  • 文章目录 DFS/BFS求解的正确性分析 为什么不能处理负权 DFS/BFS求解的正确性分析 首先我们来看算法过程: 从树上任取一点 uuu,使用DFS/BFS找到离该点最远的点,即直径的端点之一 sss 再对 sss使用一次DFS/BFS,...
  • 树的直径(两种方法)

    千次阅读 2019-07-24 13:53:00
    ①若P已经在直径上,根据树的直径的定义可知Q也在直径上且为直径的一个端点 ②若P不在直径上,我们用反证法,假设此时WQ不是直径,AB是直径 --->若AB与PQ有交点C,由于P到Q最远,那么PC+CQ>PC+CA,所以CQ>...
  • 摘要:血管直径的测量技术是目前医学图像研究的一大课题,对心血管堵塞等疾病的研究具有重要的医学价值.精确的血管直径测量不仅可以准确地判定血管病变的具体位置,而且为血管的三维重建提供了必要的数据支持,因此对...
  • week11树的直径

    2021-03-16 17:32:08
    week11:树的直径;随机选点,搜索到距离该点最远的一点,然后从该点出发获得最远点,两点间距即为直径;正常思路然后看了眼大佬的代码。real服。空间换时间。每当加入一条边:就当是两条边;to数组存边号对应的...
  • 凸包及其直径

    2014-05-28 15:14:14
    VC下输入平面点集点的个数,随机生成这些点,凸包及其直径。Debug下坐标点显示,openGL坐标显示。不想用OpenGL可以注释掉相应代码,只用Debug显示点的坐标。
  • 输入圆的半径,圆的直径、周长和面积。(圆周率取值为3.14)
  • 【算法分析】——树与直径

    千次阅读 热门讨论 2020-10-24 08:27:17
    树的直径一般用两次bfs解决,当然也可以用两次dfs,这里以bfs为例进行说明。先在树上任选一点A作为起点进行bfs,记录最后被访问的点B,那么B离A的距离最远,再以B为起点进行第二次bfs,即可得到直径。 #include &...
  • 这一部分要介绍的亚线性时间算法总共有四个,这篇短文介绍的是其中之一,点集合的直径。 我们先来看一下问题定义: 定义: 已知:有mmm个点,点与点之间的距离使用邻接矩阵表示,则DijD_{ij}Dij​表示点iii到点jjj...
  • 本文以例程方式介绍如何在Visionpro中实现圆形物体直径测量
  • 树的直径

    2019-04-01 19:44:00
    要开始学图论了。。。。。老是被在对面高二机房的高一学长图论强者ddy虐。。。。。...树的直径 ...给定一棵树,树中每条边都有一个权值,树中两点之间的距离定义为连接两点的...后者通常也可称为直径,即直径是一个数值概...
  • 如何树的直径

    2019-09-26 18:36:06
    树的直径给定一棵树,树中每条边都有一个权值,树中两点之间的距离定义为连接两点的路径边权之...后者通常也可称为直径,即直径是一个数值概念,也可代指一条路径树的直径通常有两种法,时间复杂度均为O(n)。我们...
  • 旋转卡壳--凸包最大直径

    千次阅读 2016-03-05 16:21:11
    旋转卡壳--凸包最大直径 本片博客接着上篇计算几何之凸包----Graham扫描法http://blog.csdn.net/u012328159/article/details/50808360来介绍旋转卡壳法,其实无论是凸包的最大直径也好,还是凸包上距离最远的...
  • 对于一个图G=(V, E),求图中两点u, v间最短路径长度,称为图的最短路径问题。最短路径中最长的称为图的直径。 其中,求图中确定的某两点的最短路径算法,称为单源最短路径算法。求图中任意两点间的最短路径算法,...
  • 直径

    千次阅读 2020-05-19 21:37:16
    法:任意一个点A到它的最远点B的距离为半径,B再到它的最远点C的距离为直径。 #include #include using namespace std; class Node { public: Node(int i, int w) :index(i), weight(w) { } int index; int ...
  • 找出无向连通里面的直径直径的中点就是所的根,找出直径的方法使用两次BFS,第二次BFS还要记录下,路径中每个节点的父节点,第一次随意选择一个节点做BFS所能到达的最长路径的端点肯定是直径的一端,第二次再...
  • 给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过根结点。 示例 : 给定二叉树 1 / \ 2 3 / \ 4 5 返回3, 它的长度是路径 [4,2,1,3] 或者...
  • 题目描述给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过根结点。示例 :给定二叉树1/ \2 3/ \4 5返回3, 它的长度是路径 [4,2,1,3] 或者[5,2,1,3]...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,359
精华内容 4,143
关键字:

求图的直径