树的连边II

频繁调用的函数 :如果某个函数被频繁调用,使用inline可以减少调用开销,提高程序性能。例如,在循环中频繁调用的函数

求树的直径:

两次dfs

还有求最长链和次长链的写法(max(dp[x][0],dp[x][1])):

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
int n,head[N],nxt[N<<1],to[N<<1],cnt;
//head 
inline void add(int x,int y)
{
    ++cnt;
    nxt[cnt]=head[x];
    head[x]=cnt;
    to[cnt]=y;
    return;
}
int dp[N][2];
void dfs(int x,int fa)
{
    for(int i=head[x];i;i=nxt[i])
    {
        int y=to[i];
        if(y==fa) continue;
        dfs(y,x);
        if((dp[y][0]+1)>dp[x][0])
        //这里都是dp[y][0]进行比较
        //+1体现了数据的变化
            dp[x][1]=dp[x][0],dp[x][0]=dp[y][0]+1;
        else if((dp[y][0]+1)>dp[x][1])
            dp[x][1]=dp[y][0]+1;
    }//如果大于x的最长链则
    //dp[x][1]更新为新的最大链值
    //原来的最大值变为新的次大值
    //不大于最长链但是大于次长链就更新次长链
    return;
    //那就是dp[x]+dp[y]算出的是直径包含的边,点比边多1然后+1,最后输出次大长的链再-1
}
int main()
{
    cin>>n;
    for(int i=2;i<=n;i++)
    {
        int x,y;cin>>x>>y;
        add(x,y),add(y,x);
    }
    dfs(1,0);
    int ans=0;
    for(int i=1;i<=n;i++) ans=max(ans,dp[i][0]+dp[i][1]+1);
    cout<<ans-1;
    return 0;
}
cpp 复制代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=1e5+10;
int n,head[N],nxt[N<<1],to[N<<1],cnt;
//双向边开二倍

inline void add(int x,int y)
{
	++cnt;//边的编号
	nxt[cnt]=head[x];//将节点x当前的指向的边先给编号为cnt的边
	head[x]=cnt;//节点x现在指向cnt
	to[cnt]=y;//编号为cnt的边指向的节点
	return;
}
int dp[N][2];
void dfs(int x, int fa) {
    // 遍历当前节点x的所有邻接节点
    for (int i = head[x]; i; i = nxt[i]) {
        int y = to[i];  // 获取当前边的终点节点y
        if (y == fa) continue;  // 如果y是父节点,跳过,避免返回父节点形成环

        dfs(y, x);  // 递归调用dfs,以y为新的当前节点,x为新的父节点

        // 更新dp值,dp[x][0]表示从节点x出发的最长路径长度,dp[x][1]表示次长路径长度
        // dp[y][0] + 1表示从x到y的路径长度(加1是因为从x到y有一条边)
        if ((dp[y][0] + 1) > dp[x][0]) {
            // 如果从y出发的最长路径长度加1大于从x出发的当前最长路径长度
            dp[x][1] = dp[x][0];  // 更新次长路径长度为原来的最长路径长度
            dp[x][0] = dp[y][0] + 1;  // 更新最长路径长度为从y出发的最长路径长度加1
        } else if ((dp[y][0] + 1) > dp[x][1]) {
            // 如果从y出发的最长路径长度加1大于从x出发的当前次长路径长度
            dp[x][1] = dp[y][0] + 1;  // 更新次长路径长度为从y出发的最长路径长度加1
        }
    }
    return;  // 递归返回
}
int main()
{
	scanf("%d",&n);
	for(int i=2;i<=n;i++)
	{
		int x,y;scanf("%d%d",&x,&y);
		add(x,y),add(y,x);
	}
	dfs(1,0);
	int ans=0;
	for(int i=1;i<=n;i++) ans=max(ans,dp[i][0]+dp[i][1]+1);
	printf("%d\n",ans-1);
	return 0;
}
相关推荐
No0d1es2 小时前
电子学会青少年软件编程(C/C++)5级等级考试真题试卷(2024年6月)
c语言·c++·算法·青少年编程·电子学会·五级
大阳1234 小时前
线程(基本概念和相关命令)
开发语言·数据结构·经验分享·算法·线程·学习经验
weixin_307779135 小时前
VS Code配置MinGW64编译GNU 科学库 (GSL)
开发语言·c++·vscode·算法
学行库小秘6 小时前
ANN神经网络回归预测模型
人工智能·python·深度学习·神经网络·算法·机器学习·回归
没落之殇6 小时前
基于C语言实现的HRV分析方法 —— 与Kubios和MATLAB对比
算法
秋难降6 小时前
线段树的深度解析(最长递增子序列类解题步骤)
数据结构·python·算法
楚韵天工6 小时前
基于GIS的无人机模拟飞行控制系统设计与实现
深度学习·算法·深度优先·无人机·广度优先·迭代加深·图搜索算法
你也向往长安城吗7 小时前
推荐一个三维导航库:three-pathfinding-3d
javascript·算法
百度智能云8 小时前
VectorDB+FastGPT一站式构建:智能知识库与企业级对话系统实战
算法
AI小白的Python之路9 小时前
数据结构与算法-排序
数据结构·算法·排序算法