Book of Evil

Book of Evil

https://ac.nowcoder.com/acm/problem/110130

一点细节没写好结果疯了.....

按照求树直径那样出子树内的最远距离

然后换根求子树外的最远距离

所以数组设置为无穷小,因为我们要求的是最大

#include <bits/stdc++.h>
using namespace std;
const int maxn=2e5+10;
int n,m,x;
struct edge{
    int to,nxt;
}d[maxn]; int head[maxn],cnt=1;
void add(int u,int v){
    d[++cnt]=(edge){v,head[u]},head[u]=cnt;
}
int ok[maxn],vis[maxn],f[maxn],g[maxn],pre[maxn],dp[maxn];
void dfs(int u,int fa)
{
    if( ok[u] )    f[u]=g[u]=0;
    for(int i=head[u];i;i=d[i].nxt )
    {
        int v=d[i].to;
        if( v==fa )    continue;
        dfs(v,u);
        if( f[v]+1>=f[u] )//比最大值还大 
            g[u]=f[u],f[u]=f[v]+1,pre[u]=v;
        else if( f[v]+1>g[u] )    g[u]=f[v]+1;
    }
}
void back(int u,int fa)
{
    for(int i=head[u];i;i=d[i].nxt )
    {
        int v=d[i].to;
        if( v==fa )    continue;
        if( pre[u]==v )
    //    if( f[u]==f[v]+1 )
            dp[v]=max( dp[u]+1,g[u]+1 );
        else    dp[v]=max( dp[u]+1,f[u]+1 );
        back(v,u);
    }
}
int main()
{
    cin >> n >> m >> x;
    for(int i=1;i<=n;i++)    f[i]=g[i]=dp[i]=-1e9;
    for(int i=1;i<=m;i++)
    {
        int x; cin >> x; ok[x]=1;
    }
    for(int i=1;i<n;i++)
    {
        int l,r; cin >> l >> r;
        add(l,r); add(r,l);
    }
    dfs(1,0); 
    back(1,0);
    int ans=(f[1]<=x);
    for(int i=2;i<=n;i++)
            ans += (dp[i]<=x&&f[i]<=x );
    cout << ans;
}
全部评论

相关推荐

12-06 20:47
已编辑
复旦大学 C++
华为 终端小艺 定级估计是15a
khj:只要家里条件还行和不愿意太卷真别去华为这种农村做题家云集的地方
点赞 评论 收藏
分享
11-05 07:29
贵州大学 Java
点赞 评论 收藏
分享
牛客279957775号:铁暗恋
点赞 评论 收藏
分享
评论
3
收藏
分享
牛客网
牛客企业服务