【2018 CCPC网络赛】1009 - 树
2024-10-21 14:21:07
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=6446
题目给出的数据为一棵树,dfs扫描每条边,假设去掉某条边,则左边 x 个点,右边 n-x 个点,则经过该条边共有 x*(n-x) 种组合,又因为 1~n 全排列有 n! 种,故 a~b,包含 b~a 这条边的贡献为 (n-x)*x*2*(n-1)!*w;
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std; #define LL long long
const int MOD = 1e9+;
const int N = 1e5+;
struct EDGE {
LL to, length;
};
vector<EDGE> edge[N];
LL n, factorial[N], lchild[N], w[N]; int dfs(int k, int pre) {
int size = edge[k].size(), ans=;
for(int i=; i<size; i++) {
if(edge[k][i].to == pre)
w[k] = edge[k][i].length;
else
ans += dfs(edge[k][i].to, k);
}
return lchild[k] = ans;
} int main()
{
factorial[] = ;
for(int i=; i<N; i++)
factorial[i] = factorial[i-]*i%MOD; while(~scanf("%d",&n))
{
LL ans=;
for(int i=; i<=n; i++) {
edge[i].clear();
}
for(int x,y,v,i=; i<n; i++) {
scanf("%d%d%d", &x, &y, &v);
edge[x].push_back({y,v});
edge[y].push_back({x,v});
} dfs(, -);
for(int i=; i<=n; i++) {
LL tmp=;
tmp = lchild[i]*(n-lchild[i])%MOD;
tmp = *factorial[n-]%MOD*w[i]%MOD*tmp%MOD;
ans = (ans+tmp)%MOD;
}
cout<<ans<<endl;
}
return ;
}
最新文章
- 详解Maple如何公式推导和生成代码
- C语言基础(8)-const,volatile,register关键字
- 【BZOJ-1923】外星千足虫 高斯消元 + xor方程组
- Hibernate一级缓存与二级缓存的区别
- FTP主/被动模式的原理
- [EXCEL] 在单元格中自动输入时间和日期
- 让 asp.net mvc 支持 带有+ _ 等特殊字符的路由
- POJ 3384 Feng Shui
- [转]CSS vertical-align属性详解 作者:黄映焜
- PHP - 设置地址栏小图标
- replace深入
- Python基础练习题100例(Python 3.x)
- ADC获取滑块的值(8通道)
- 适用于typecho0.9的评论表情插件
- python文章装饰器理解12步
- CentOS 安装git
- GRE封装解封装过程
- switch(值){ 开始case 值: 闭合break; }
- 通过 JDK 自带的 javap 命令查看 SynchronizedDemo 类的相关字节码信息
- VS从数据库表生成Model代码