待整理

1072. 树的最长路径

点击查看代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 1e4 + 10, M = 2 * N;

int h[N], e[M], ne[M], w[M], idx;
int n, ans;

void add(int a, int b, int c)
{
    e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx ++;
}

int dfs(int u, int fa){  //表示以u为顶点的最长路径
    int dist = 0;        //表示以u为顶点的最长路径
    //还要求一下以u为最高点的路径
    int d1 = 0, d2 = 0;
    for(int i = h[u]; i != -1; i = ne[i]){
        int j = e[i];
        if(j == fa) continue;
        int d = dfs(j, u) + w[i];
        
        if(d > d1) d2 = d1, d1 = d;
        else if(d > d2) d2 = d;
        
        dist = max(dist, d);
    }
    ans = max(ans, d1 + d2);
    
    return dist;
}

int main()
{
    scanf("%d", &n);
    memset(h, -1, sizeof h);
    for(int i = 1; i < n; i ++){
        int x, y, z;
        scanf("%d%d%d", &x, &y, &z);
        add(x, y, z), add(y, x, z);
    }
    
    dfs(1, -1);
    
    printf("%d\n", ans);
    
    return 0;
}

1073 树的中心

点击查看代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 1e4 + 10, M = 2 * N;
const int INF = 0x3f3f3f3f;

int h[N], e[M], ne[M], w[M], idx;
int n;
int d1[N], d2[N], up[N], p1[N], p2[N];

void add(int a, int b, int c){
    e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx ++;
}

int dfs_d(int u, int fa){
    d1[u] = d2[u]= -INF;
    
    for(int i = h[u]; i != -1; i = ne[i]){
        int j = e[i];
        if(j == fa) continue;
        int d = dfs_d(j, u) + w[i];
        if(d >= d1[u]){
            d2[u] = d1[u], p2[u] = p1[u];
            d1[u] = d, p1[u] = j;
        }
        else if(d > d2[u]){
            d2[u] = d, p2[u] = j;
        }
    }
    //cout << d1[u] << endl;
    if(d1[u] == -INF) d1[u] = d2[u] = 0;
    
    return d1[u];
}

void dfs_u(int u, int fa)
{
    for(int i = h[u]; i != -1; i = ne[i]){
        int j = e[i];
        if(j == fa) continue;
        if(p1[u] == j) up[j] = max(up[u], d2[u]) + w[i];
        else up[j] = max(up[u], d1[u]) + w[i];
        dfs_u(j, u);
    }
    return;
}

int main()
{
    scanf("%d", &n);
    memset(h, -1, sizeof h);
    for(int i = 1; i < n; i ++){
        int x, y, z;
        scanf("%d%d%d", &x, &y, &z);
        add(x, y, z), add(y, x, z);
    }
    
    dfs_d(1, -1);
    dfs_u(1, -1);
    
    int ans = INF;
    for(int i = 1; i <= n; i ++) ans = min(ans, max(up[i], d1[i]));
    
    printf("%d\n", ans);
    
    return 0;
}
posted @   小菜珠的成长之路  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示