zoukankan      html  css  js  c++  java
  • (树的直径)LightOJ -- 1094

    链接:

    http://acm.hust.edu.cn/vjudge/contest/view.action?cid=88230#problem/C

    求树的直径,这里只不过给每条边增加一个边长属性,变成了求树上两点距离最远为多少

    树的直径,在今天比赛前我是没有接触过的, 队友说在学长的博客上看是用了两个bfs就可以了,可我看的题解是用了两个dfs

    应该意思是一样的吧!!! 都学习一下

    题解的代码:

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #include <cstdlib>
    using namespace std;
    
    #define N 30005
    
    struct node
    {
        int v, next, w;
    }edge[N<<1];
    
    int Head[N], dis[N];
    int cnt, Max, Index;
    
    void Add(int u, int v, int w)
    {
        edge[cnt].v = v;
        edge[cnt].w = w;
        edge[cnt].next = Head[u];
        Head[u] = cnt++;
    }
    
    void dfs(int u, int w)
    {
        dis[u] = w;
    
        if(dis[u] > Max)
        {
            Max = dis[u];
            Index = u;
        }
    
        for(int i=Head[u]; i!=-1; i=edge[i].next)
        {
            int v = edge[i].v;
    
            if(dis[v] == -1)
                dfs(v, dis[u]+edge[i].w);
        }
    }
    
    int main()
    {
        int t, n, iCase=1;
    
        scanf("%d", &t);
        while(t--)
        {
            scanf("%d", &n);
            memset(Head, -1, sizeof(Head));
            cnt = Max = 0;
    
            for(int i=1; i<n; i++)
            {
                int u, v, w;
                scanf("%d%d%d", &u, &v, &w);
                Add(u, v, w);
                Add(v, u, w);
            }
    
            memset(dis, -1, sizeof(dis));
            dfs(0, 0);
    
            memset(dis, -1, sizeof(dis));
            dfs(Index, 0);
            printf("Case %d: %d
    ", iCase++, Max);
        }
        return 0;
    }
    勿忘初心
  • 相关阅读:
    百度云人脸识别API人脸库管理
    百度云人脸识别API人脸对比
    Linux之find命令
    Linux之grep命令
    Linux之sed命令
    LNMP Shell脚本发布
    auto_modify_ip Shell脚本安装
    JVM虚拟机详解+Tomcat性能优化
    Tomcat连接器详解
    Tomcat配置详解
  • 原文地址:https://www.cnblogs.com/YY56/p/4737848.html
Copyright © 2011-2022 走看看