河南萌新联赛2024第(四)场(部分)

I、马拉松
设sum【i】为X或Y 周围的且不在XY路径上的点
所以这题的答案 就是从sum【x】中选一个起点,sum【y】中选一个终点,答案就是 sum【x】*sum【y】
可以用dfs实现

void dfs(int u ,int pa)   //dfs是有方向的
{
    sum[u] = 1;
    for(auto now :v[u])
    {
        if(now == pa) continue;
        else{
            dfs(now,u);
            sum[u] += sum[now];
            //在xy的路径上
            if(f[now]&&u==x) sum[u] -= sum[now];
            if(f[now]) f[u]=1;
        }
    }
}
void solve()
{
    cin>>n>>x>>y;
    for(int i=1;i<=n-1;i++)
    {
        int g,h;
        cin>>g>>h;
        v[g].pb(h);
        v[h].pb(g);
    }
     
    f[y] = 1;
    dfs(x,0);
    cout<<sum[x]*sum[y]<<endl;
    for(int i=1;i<=15;i++) cout<<i<<" "<<sum[i]<<endl;
    return;
}
posted @ 2024-08-10 15:43  lelemeimei  阅读(6)  评论(0编辑  收藏  举报