【ccpc网络赛】Tree and Permutation【1009】【树上+组合数学】
题意:
给定一棵无向树,求出树上所有顶点的全排列。
如1 3 2 4 5 与 1 3 4 5 2,定义每种全排列的值为1->3+3->2+2->4+4->5的最短路径之和。
求出所有全排列的值。
思路:
对于这样一个问题,考虑到数据范围,如果设计一种针对每种全排列而进行的算法显然是不现实的,必须得从整张图进行考虑。
可以发现在整张图中,每条边被遍历的次数都是固定的。因此可以从这个角度入手进行求解。
可以发现对于每一条边而言,该边被遍历的次数为
(左端点的的点数)*(右端点的点数)* 2 *(n-1)* (n-2)!
(n-1)为在n个顶点的全排列中两个相邻点最多出现的次数,2为两个相邻点可以交换位置,(n-2)!为确定两个点之后,其他的点有(n-2)!中排列方式,由此对每条边进行计算即可。
代码:
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#define rep(i,a,b) for(ll i = a;i <= b;i++)
using namespace std;
const int N = 2*1e5+1000;
typedef long long ll;
const ll mod = 1e9+7;ll n;
struct Edge{int to,next;ll w;
}e[N];
int head[N],tot;
ll size[N];
ll ans;void init()
{rep(i,1,n) head[i] = 0;tot = 1;ans = 0;
}
ll fac[N];
void add(int x,int y,int z)
{e[++tot].to = y; e[tot].next = head[x]; head[x] = tot; e[tot].w = (ll)z;
}void dfs(int u,int fa) //fa:父节点
{size[u] = 1; //mxson:重儿子的大小for(int i = head[u]; i ; i = e[i].next){int v = e[i].to;if(v == fa) continue; //控制搜索路径不会搜到父节点dfs(v,u);size[u] = size[u] + size[v];ans = ans+(e[i].w*(n-size[v]))%mod*size[v]%mod;// printf("ans1 : %lld\n",ans);ans %= mod;// printf("size:%d,u:%d\n",size[u],u);}
// printf("ans:%lld\n",ans);
}int main()
{fac[0] = 1;fac[1] = 1;for(ll i = 2;i <= 100000;i ++){fac[i] = fac[i-1]*i%mod;}while(~scanf("%lld",&n)){init();rep(i,1,n-1){int a,b,c;scanf("%d%d%d",&a,&b,&c);add(a,b,c); add(b,a,c);}dfs(1,0);ans = (ans*((ll)2*(ll)n-(ll)2)%mod);// printf("ans2 : %lld\n",ans);if(n >= 2)ans = ((ans % mod)* fac[n-2]) %mod;printf("%lld\n",ans);}return 0;
}
【ccpc网络赛】Tree and Permutation【1009】【树上+组合数学】相关推荐
- Jumping Monkey(CCPC网络赛重赛)
Jumping Monkey(CCPC网络赛重赛) 题意: n个点的树,每个点有一个不同的值aia_iai.现在一个猴子在树上,这个猴子从点u跳到点v当且仅当ava_vav是u到v最短路径上的最大 ...
- (四面体)CCPC网络赛 HDU5839 Special Tetrahedron
1 CCPC网络赛 HDU5839 Special Tetrahedron 2 题意:n个点,选四个出来组成四面体,要符合四面体至少四条边相等,若四条边相等则剩下两条边不相邻,求个数 3 思路:枚举四 ...
- 2020 CCPC网络赛 赛后感
第一次参加,做过去年19年网络赛的题,去年是四个水题稳做出,然后还有两个线段树和树状数组的题(好像是),所以本来对这次网络赛挺有信心的(去年好像四个题就能进,当然要手速快). 这次网络赛还是有四个水题 ...
- CCPC 网络赛总结
下午这场比赛一开始就没有给自己太大的压力,本着把水题全部 AC 的意愿 大学第一次网络赛就这样结束了,一开始跟着榜做,签到题很快就解决了,不过这次的比赛真的是刷新了我对题意的认识,各种数学公式交叉在一 ...
- hdu6438 Buy and Resell 买卖物品 ccpc网络赛 贪心
题目传送门 题目描述: 有n座城市,每座城市都可以对一个物品进行一次的买进或者卖出,可以同时拥有多个物品,计算利润最大值,并且交易次数要最少.(买入卖出算两次操作) 思路: 建立两个小根堆 优先队列, ...
- HDU 6889 Graph Theory Class(CCPC网络赛)
hdu 6889 传说中的人均min25 题意: n个点的完全图,边权为lcm(i+1,j+1),求mst(最小生成树) 题解: 我一开始以为是推公式,毕竟数据范围这么大,但是自己画图来看看mst的情 ...
- HDU 5842—— Lweb and String CCPC 网络赛 1011
题意: 按字母出现的顺序编号,问最长上升子序列. 思路: 最长为26,出现一个新的字母就加上,答案为字母的种数,无聊的题目. code: #include <cstdio> #includ ...
- 2017 ccpc网络赛 1001 Vertex Cover(二分图 构造)HDU6150
题意:"最小点覆盖集"是个NP完全问题 有一个近似算法是说-每次选取度数最大的点(如果有多个这样的点,则选择最后一个) 让你构造一个图,使得其近似算法求出来点数是你给定的覆盖点数的 ...
- 2018 CCPC网络赛1004 HDU6441 Find Integer
https://www.zybuluo.com/yang12138/note/1262383 转载于:https://www.cnblogs.com/yang12138/p/9537246.html
- 2019年CCPC - 网络赛E:huntian oy【杜教筛】
题目: HDU---6706:huntian oy 题意: 给定N,a,b,求下面式子的值(求和后再mod 1e9+7): 分析: 一直怯于杜教筛不敢去学习[一看就会的杜教筛],今天终于迈出了这一步, ...
最新文章
- 精品德国软件 UltraShredder 文件粉碎机
- 五行塔怎么吃第五个_红毛丹怎么吃 吃红毛丹的五个好处
- 使用StaticLayout实现文字转化为图片的效果(类似发送长微博)
- Anaconda-- conda 创建、激活、退出、删除虚拟环境
- boost::mpi模块围绕环传递数据的通信器的测试
- PHP分页的limit与offset
- 这些年遇到的坑爹问题汇总
- 关于HTTP协议及SOCKET通信
- 实例构造器和类(引用类型)
- ssrs 基于表达式显示_基于表达式的访问控制
- fla 走迷宫游戏 源码_迷宫新玩法,果断一试
- python访问网站添加请求头_Python headers请求头如何实现快速添加
- Linux系统开发9 线程同步
- guava中Range的使用方法(com.google.common.collect.Range)
- Android开发笔记(二十三)文件对话框FileDialog
- 解决路由环路问题的探讨
- Linux CentOS 7.2 安装 Tomcat 8 服务器
- 小程序wx.showActionSheet 调起转发、分享
- ipq4029 高通 芯片 openwrt 资料收集
- linux查看db2表空间大小,DB2查看表空间大小及使用情况
热门文章
- 工作那些事(四)大公司VS小公司
- 关于silverlight打印功能
- MySQL Oracle默认排序_PostgreSQL、MySQL、Oracle,查询的默认排序是怎样的?
- 更改wordpress上传文件大小限制
- OpenCV-图像处理(20、霍夫变换-直线)
- ppt地图分布图一块一块的怎么做_没想到PPT还能这样做动态地图,实在是太炫酷了,用了再也离不开...
- linux常用命令 less,Linux常用基本命令(less)
- java文件的打包和解包,Java包装类:什么是包装类对象,什么是打包和解包,当编译遇到自动打包和解包时会发生什么?...
- java 字符串数组排序_Java 使用泛型为不同类型数组排序
- HP 滤波 (Hodrick Prescott Filter)