链接:

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\n", iCase++, Max);
    }
    return 0;
}

 

posted on 2015-08-17 21:35  栀蓝  阅读(253)  评论(0编辑  收藏  举报

levels of contents