CCF-CSP题解 201503-4 网络延时

求树的直径。

两遍\(dfs\)就好了。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <stack>
const int maxn = 10000;
const int maxm = 10000;

using namespace std;

int to[(maxn + maxm) * 2 + 10];
int nex[(maxn + maxm) * 2 + 10];
int head[maxn + maxm + 10], cnt = 0;

void addEdge(int a, int b)
{
    to[cnt] = b; nex[cnt] = head[a]; head[a] = cnt++;
    to[cnt] = a; nex[cnt] = head[b]; head[b] = cnt++;
}

int ans, depth;

void dfs(int x, int f, int d)
{
    if (d > depth)
        ans = x, depth = d;
    for (int i = head[x]; i != -1; i = nex[i])
    {
        int l = to[i];
        if (l != f)
            dfs(l, x, d + 1);
    }
}

int main()
{
    int n, m;
    scanf("%d%d", &n, &m);

    memset(head, -1, sizeof(head));

    for (int i = 2, temp; i <= n; i++)
    {
        scanf("%d", &temp);
        addEdge(i, temp);
    }

    for (int i = 1, temp; i <= m; i++)
    {
        scanf("%d", &temp);
        addEdge(i + n, temp);
    }

    ans = depth = -1;
    dfs(1, 1, 0);

    depth = -1;
    dfs(ans, ans, 0);

    printf("%d\n", depth);

    return 0;
}

转载于:https://www.cnblogs.com/acboyty/p/11479076.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值