牛客小白月赛127 E

E-Flower_Rainbow_and_Game_牛客小白月赛127

这个题我们可以先算出所有点对之间的距离 然后将所有含有父子关系的点对的距离减去 然后加1 也就是代价变为1 对于所有点对的距离和 我们可以计算每条边的贡献 每条边被遍历的次数和就是所有点对的距离和 那么对于u 和 v 他们之间的边被遍历的次数就等于size[v]*(n-size[v]) 累加即可

对于所有有父子关系的点 他们的距离和就是 v的所有子节点的深度和-v的子节点的数目*父节点的深度

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
void solve(){
    int n;cin>>n;
    vector<vector<int>>e(n+1);
    for(int i=1;i<n;i++){
        int u,v;cin>>u>>v;
        e[u].push_back(v);
        e[v].push_back(u);
    }
    long long ans=0;
    vector<int> sz(n+1,1),dep(n+1);
    auto dfs=[&](auto &&self,int u,int f)->void{
        for(auto v:e[u]){
            if(v!=f){
                dep[v]=dep[u]+1;
                self(self,v,u);
                ans+=sz[v]*(n-sz[v]);
                sz[u]+=sz[v];
            }
        }
    };
    dfs(dfs,1,0);
    vector<int>s=dep;
    auto dfs2=[&](auto &&self,int u,int p)->void{
        for(auto v:e[u]){
            if(v!=p){
                self(self,v,u);
                s[u]+=s[v];
                ans-=s[v]-dep[u]*sz[v];
                ans+=sz[v];
            }
        }
    };
    dfs2(dfs2,1,0);
    cout<< ans % 998244353<<'\n';
}
signed main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int t;cin>>t;
    while(t--)solve();
    return 0;
}
相关推荐
WolfGang0073215 分钟前
代码随想录算法训练营 Day50 | 图论 part08
数据结构·算法·图论
aini_lovee2 小时前
多目标粒子群优化(MOPSO)双适应度函数MATLAB实现
人工智能·算法·matlab
yong99902 小时前
图像融合与拼接:完整MATLAB工具箱
算法·计算机视觉·matlab
春风不语5052 小时前
深入理解主成分分析(PCA)
算法
apollowing2 小时前
启发式算法WebApp实验室:从搜索策略到群体智能的能力进阶(二十二)
算法·启发式算法·web app
晚枫歌F2 小时前
最小堆定时器
数据结构·算法
Lumos_7773 小时前
Linux -- 线程
java·jvm·算法
七颗糖很甜3 小时前
“十五五”气象发展规划:聚焦五大核心任务
大数据·python·算法
科研前沿3 小时前
镜像视界浙江科技有限公司的关键技术突破有哪些?
大数据·人工智能·科技·算法·音视频·空间计算
嫩萝卜头儿4 小时前
2 - 复杂度收尾 + 链表经典OJ
数据结构·算法·链表·复杂度