Tree

Tree

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

题意:
给与一棵n个节点的树,求每个点的连通点集的数量?

思路:
树形结构+换根
dp[i]表示以i为根且包括i的这棵子树连通点集的数量。
ans[i]表示包括i的连通点集的数量,既结果。
父节点u与子节点v:
dp[u]=图片说明 (dp[v]+1) * dp[u];(v为u的子节点)
换根时:
ans[v]=((ans[u]/(dp[v]+1))+1)*dp[v];
注意:0不能求逆元,所以当(dp[v]+1)%inf=0时,你就需要重新计算一下该点的结果。

代码:

#include <bits/stdc++.h>
typedef long long ll;

using namespace std;

const ll inf=1e9+7;

inline int read()
{
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9')
    {
        x=(x<<1)+(x<<3)+(ch^48);
        ch=getchar();
    }
    return x*f;
}

ll dp[1000005], ans[1000005];

vector<int> g[1000005];

void dfs(int v, int f)
{
    dp[v]=1;
    for(int i=0;i<g[v].size();i++)
    {
        if(g[v][i]!=f)
        {
            dfs(g[v][i],v);
        }
        else
        {
            continue;
        }
        dp[v]=((dp[g[v][i]]+1)*dp[v])%inf;
    }
}

ll fun(ll n,ll m)
{
   ll s=1;
   while(m)
   {
       if(m&1)
       {
           s=s*n%inf;
       }
       n=n*n%inf;
       m=m/2;
   }
   return s;
}

void dfs1(int v, int f)
{
    if(f!=-1)
    {
        if((dp[v]+1)%inf==0)
        {
            dfs(v,-1);
            ans[v]=dp[v];
        }
        else
        {
            ans[v]=((ans[f]*fun((dp[v]+1),inf-2)%inf)+1)*dp[v]%inf;
        }
    }
    else
    {
        ans[v]=dp[v];
    }
    for(int i=0;i<g[v].size();i++)
    {
        if(g[v][i]!=f)
        {
            dfs1(g[v][i],v);
        }
    }
}

int main()
{
    int n;
    scanf("%d",&n);
    for(int i=2;i<=n;i++)
    {
        int u=read(), v=read();
        g[u].push_back(v);
        g[v].push_back(u);
    }
    dfs(1,-1);
    dfs1(1,-1);
    for(int i=1;i<=n;i++)
    {
        printf("%lld\n",ans[i]);
    }
    return 0;
}
全部评论

相关推荐

昨天 13:24
已编辑
江西农业大学 后端工程师
最近或许大家都听说xxxx厂裁员,无论前端,后端,大数据,测试,运维,人人可危,&nbsp;“前端死了,后端也死了,JAVA崩盘了,你们这群搞大模型的真是码奸”这次AI真的会让我们无路可走吗????????太阳底下已经没有新鲜事了旧的生产力的消失,必然有新的生产力诞生马车夫消失&nbsp;→&nbsp;汽车司机、修车工、石油工业诞生,从业人数是马车夫的百倍手工纺织女工消失&nbsp;→&nbsp;纺织机械工程师、面料设计师诞生,纺织品产量提升百倍2007年苹果开放&nbsp;App&nbsp;Store,&quot;移动端开发者&quot;这个职业压根不存在。八年后,全球应用经济规模突破&nbsp;1000亿美元,凭空诞生了数百万开发者岗位。每一次&quot;这次真的完了...
二十岁的编程男神王大...:那这个时代是什么时代呢? 是全员agent的时代,是前端+AI,后端+AI的时代,AI已经融入了项目生命周期的的每一个角落,那我最近在做的东西举例,检查BUG时,我们会用codex,CC等工具的skill去check,效果好还能直接fix,测试的时候,apifox等工具已经有了AI落地的改造,CI/CD阶段,我们会根据hook去跑AI check脚本,就连不少中间件,也迎来了AI落地的改造,(AI网关,AI在MQ中的运用),都可以去了解下 另外记着,这些东西不是意义,工作只是谋生的一个手段,ai是让开发提效了,但是呢,原先一周的工作流程压缩到了两天内,同时低级的都裁员了,只有高级的去维护,你看似写的大义凛然,或许那天你也会成为你文章里面拒绝往前走的人,你才大二,面对技术有热情是对的
AI求职实录
点赞 评论 收藏
分享
03-21 10:53
复旦大学 Java
大家好,我是@程序员花海,眼下&nbsp;26&nbsp;届春招、27&nbsp;届暑期实习全面开启,后端卷到没边,AI&nbsp;Agent的岗位占主导,很多牛友在我的评论区留言,想让我出一份Agent学习路线。我特意去看了下,打开淘天的招聘页面,以校招为例,一眼望去全是AI相关的岗位,只能说之后绝大多数岗位都会快速推进AI的落地和实践。之前写过&nbsp;Java&nbsp;后端&nbsp;3&nbsp;个月抢救路线https://www.nowcoder.com/discuss/824693499982315520?sourceSSR=users,也收到了牛友们的强烈好评,这次专门给后端转&nbsp;Agent做一套最少必要知识路线——&nbsp;不堆概念、不啃论文,只学面试必问、项目...
在职牛马didi:这篇路线整理得很系统,把后端知识映射到Agent体系这个思路特别实用。我自己也是从Java转做AI的,感触很深:工程底子扎实的人转Agent确实有优势,RAG和工具编排这些核心能力本质上都是后端逻辑的延伸。我们团队在做天猫的AI应用落地,方向跟你这篇路线里的企业级RAG和Agent系统很接近。暑期实习还在招AI应用研发工程师,JD可以参考看看跟你背景是否匹配:https://www.nowcoder.com/jobs/detail/440929?jobId=440929
软件开发投递记录
点赞 评论 收藏
分享
评论
5
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务