传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6446

本题是一个树上的问题——DFS。

一棵N个结点的树,其结点为1~N。树具有N-1条边,每一条边具有一个权值。

1~N具有N!个不同的排列,第i(1≤i≤N!)个排列记为P[i],第i个排列中的第j(1≤j≤N)个数记为P[i][j]。

对于第i个排列P[i],在树上沿最短路依次通过P[i][1]~P[i][N]。记最短路的权值和为S[i],求解:

$\sum_{i=1}^{N!} S_i \mod M$

考虑1~N间的两个不同的数u、v。在N!个排列中,v恰好为u的后继的排列数为(N-1)!。于是,若记u→v的最短路为D(u,v),则所求答案为:

$(N-1)!\:*\sum_{u\ne v}D(u,v)\mod M$

现在,考虑式:

$f(T)=\sum_{u<v}D(u,v)\cdots(*)$

接下来,考虑树的结点与边。无向树上的每一个结点都是树的割顶,每一条边都是树的桥。于是,树上的每一条边将树划分为两棵子树。考虑连接结点u、v的边:这条边将树划分为以结点u为根的子树、和以结点v为根的子树。设以结点u为根的子树的结点数为cnt[u],则以结点v为根的子树的结点数为cnt[v]=N-cnt[u]。

回到式(*)中,则边(u,v)对式子的贡献为$w(u,v)*cnt[u]*cnt[v]$。

考虑通过DFS预处理cnt[]:选取某一个结点作为根结点,通过DFS预处理以结点u为根的子树的结点数cnt[u]。之后,遍历树上的边:连接结点v与其父结点的边,其对式子的贡献为$w(p[v],v)*cnt[v]*(N-cnt[v])$。

考虑到双向,答案为$ans=2(N-1)!\:*f(T)\mod M$。

参考程序如下:

#include <bits/stdc++.h>
using namespace std; #define MAX_N 100005 const int64_t mod = 1e9 + ; struct arrow
{
int to;
int cost;
arrow(int to = , int cost = ) : to(to), cost(cost) {}
}; int64_t fact[MAX_N]; void init(void)
{
fact[] = ;
for (int i = ; i < MAX_N; i++) fact[i] = fact[i - ] * i % mod;
} int n;
vector<arrow> adj[MAX_N]; int64_t ans;
int cnt[MAX_N]; void dfs_cnt(int u, int p)
{
cnt[u] = ;
for (int i = ; i < adj[u].size(); i++) {
int v = adj[u][i].to;
if (v == p) continue;
dfs_cnt(v, u);
cnt[u] += cnt[v];
}
} void dfs_calc(int u, int p)
{
for (int i = ; i < adj[u].size(); i++) {
int v = adj[u][i].to;
int w = adj[u][i].cost;
if (v == p) continue;
int64_t cur = 1ll * cnt[v] * (n - cnt[v]);
ans += cur * w % mod;
ans %= mod;
dfs_calc(v, u);
}
} int main(void)
{
ios::sync_with_stdio(false);
init();
while (cin >> n) {
memset(cnt, , sizeof(cnt));
for (int i = ; i < n; i++) {
int u, v, w;
cin >> u >> v >> w;
adj[u].push_back(arrow(v, w));
adj[v].push_back(arrow(u, w));
}
ans = ;
dfs_cnt(, -);
dfs_calc(, -);
cout << 2ll * ans % mod * fact[n - ] % mod << endl;
for (int i = ; i <= n; i++) adj[i].clear();
}
return ;
}

HDU - 6446 Tree and Permutation的更多相关文章

  1. (1009) HDU 6446 Tree and Permutation(规律+树上各个点的距离和)

    题意: 给一棵N个点的树,对应于一个长为N的全排列,对于排列的每个相邻数字a和b,他们的贡献是对应树上顶点a和b的路径长,求所有排列的贡献和. 分析: 经过简单的分析可以得知,全部的贡献其实相当与(这 ...

  2. HDU 6446 Tree and Permutation(赛后补题)

    >>传送门<< 分析:这个题是结束之后和老师他们讨论出来的,很神奇:刚写的时候一直没有注意到这个是一个树这个条件:和老师讨论出来的思路是,任意两个结点出现的次数是(n-1)!, ...

  3. Tree and Permutation (HDU 6446) 题解

    // 昨天打了一场网络赛,表现特别不好,当然题目难度确实影响了发挥,但还是说明自己太菜了,以后还要多多刷题. 2018 CCPC 网络赛 I - Tree and Permutation 简单说明一下 ...

  4. 2018中国大学生程序设计竞赛 - 网络选拔赛 hdu Tree and Permutation 找规律+求任意两点的最短路

    Tree and Permutation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Oth ...

  5. HDU 5868 Different Circle Permutation(burnside 引理)

    HDU 5868 Different Circle Permutation(burnside 引理) 题目链接http://acm.hdu.edu.cn/showproblem.php?pid=586 ...

  6. hdu 5225 Tom and permutation(回溯)

    题目链接:hdu 5225 Tom and permutation #include <cstdio> #include <cstring> #include <algo ...

  7. hdu 5909 Tree Cutting [树形DP fwt]

    hdu 5909 Tree Cutting 题意:一颗无根树,每个点有权值,连通子树的权值为异或和,求异或和为[0,m)的方案数 \(f[i][j]\)表示子树i中经过i的连通子树异或和为j的方案数 ...

  8. HDU6446 Tree and Permutation(树上DP)

    传送门:点我 Tree and Permutation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (J ...

  9. 2018中国大学生程序设计竞赛 - 网络选拔赛 1009 - Tree and Permutation 【dfs+树上两点距离和】

    Tree and Permutation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Oth ...

随机推荐

  1. 洛谷P1850 [noip2016]换教室——期望DP

    题目:https://www.luogu.org/problemnew/show/P1850 注释掉了一堆愚蠢,自己还是太嫩了... 首先要注意选或不选是取 min 而不是 /2 ,因为这里的选或不选 ...

  2. 【废弃中】【WIP】JavaScript 数组

    创建: 2018/01/22 更新: 2018/05/20 把此博文加入[javascript]分类, 原来忘记了 废弃: 2019/02/19 重构此篇.原文归入废弃  增加[废弃中]标签与总体任务 ...

  3. 技嘉,u盘安装win7,提示“找不到驱动器设备驱动程序”

    错误图: 解决办法: 网上说什么换usb2.0,修复用命令启动芸芸,反正对我来说没发现有什么卵用 详细步骤: 点击进入详细步骤页面地址

  4. 【hdu多校联考第二场】Odd Shops

    Description 这道题的题意是这道难读,大概就是给你n个商店,每个商店的重量为i的商品用ai表示,对于任意商店的a数列都是相同的,重量的范围为[1,10] 求购买方案总数为奇数的重量一共有多少 ...

  5. [转]Git使用基础篇

    http://www.git-scm.com/ https://try.github.io/levels/1/challenges/1 本文转自:http://www.open-open.com/li ...

  6. EasyUI系列学习(十)-Tabs(选项卡)

    一.创建组件 <div class="easyui-tabs" style="width:500px;height:250px"> <div ...

  7. MacOS 下安装 MySQL8.0 登陆 MySQL

    按照 官方教程 ,下载安装包,点击安装后,如需在命令行启动,还需设置命令路径: 在命令行中,打开配置文件 .bash_profile: vim ~/.bash_profile 在最后一行加上: PAT ...

  8. Redis安全与持久化(适合小白阅读)

    前言:Redis的使用越来越重要.以下仅为个人学习的点点记录.仅供参考. 一.简单的redis安全性设置 1. 生产环境的redis最好建议在redis配置文件中设置bind.配置允许指定的ip登陆r ...

  9. [ Luogu 4917 ] 天守阁的地板

    \(\\\) \(Description\) 定义二元函数\(F(x,y)\)表示,用 \(x\times y\) 的矩形不可旋转的铺成一个任意边长的正方形,所需要的最少的矩形个数. 现在\(T\)组 ...

  10. 08使用NanoPiM1Plus在Android4.4.2下接TF卡

    08使用NanoPiM1Plus在Android4.4.2下接TF卡 大文实验室/大文哥 壹捌陆捌零陆捌捌陆捌贰 21504965 AT qq.com 完成时间:2017/12/5 17:51 版本: ...