题目大意:
  一个有向无环图上有n个结点,
  现在告诉你n-1个条件(x,y),表示x和y的先后关系。
  问原图共有几种可能的拓扑序?

思路:
  树形DP。
  f[i][j]表示对于第i个结点,有j个点在它前面的方案数。
  设当前结点为x,后面有一个结点为y,原本x前有i个结点,y前有j个结点,我们可以得到状态转移方程:
  f[x][size[x]-i+size[y]-j]+=f[x][size[x]-i]*c[i+j][i]*c[size[x]-i+size[y]-j][size[y]-j]*((sum[y][size[y]]-sum[y][size[y]-j]+mod)%mod);
  其中c是预处理好的组合数,sum是f数组的前缀和。
  同样对于y在x前面的情况,状态转移方程如下:
  f[x][i+j]+=f[x][i]*c[i+j][i]*c[size[x]-i+size[y]-j][size[y]-j]*sum[y][j];
  最后就是求f[root][0]~f[root][n-1]的和,也就是sum[root][n]。

  1. #include<cstdio>
  2. #include<cctype>
  3. #include<vector>
  4. #include<cstring>
  5. typedef long long int64;
  6. inline int getint() {
  7. register char ch;
  8. while(!isdigit(ch=getchar()));
  9. register int x=ch^'';
  10. while(isdigit(ch=getchar())) x=(((x<<)+x)<<)+(ch^'');
  11. return x;
  12. }
  13. const int N=,mod=1e9+;
  14. struct Edge {
  15. int to;
  16. bool type;
  17. };
  18. std::vector<Edge> e[N];
  19. inline void add_edge(const int &u,const int &v,const bool &type) {
  20. e[u].push_back((Edge){v,type});
  21. e[v].push_back((Edge){u,!type});
  22. }
  23. int c[N][N];
  24. inline void prep() {
  25. for(register int i=;i<N;i++) {
  26. c[i][]=;
  27. for(register int j=;j<=i;j++) {
  28. c[i][j]=(c[i-][j-]+c[i-][j])%mod;
  29. }
  30. }
  31. }
  32. int f[N][N],sum[N][N],size[N];
  33. inline void init() {
  34. memset(f,,sizeof f);
  35. for(register int i=;i<N;i++) {
  36. e[i].clear();
  37. }
  38. }
  39. void dp(const int &x,const int &par) {
  40. size[x]=;
  41. f[x][]=;
  42. for(unsigned i=;i<e[x].size();i++) {
  43. const int &y=e[x][i].to;
  44. if(y==par) continue;
  45. dp(y,x);
  46. static int g[N];
  47. memset(g,,sizeof g);
  48. if(e[x][i].type) {
  49. for(register int i=;i<=size[x];i++) {
  50. for(register int j=;j<=size[y];j++) {
  51. g[size[x]-i+size[y]-j]
  52. +=(int64)f[x][size[x]-i]
  53. *c[i+j][i]%mod
  54. *c[size[x]-i+size[y]-j][size[y]-j]%mod
  55. *((sum[y][size[y]]-sum[y][size[y]-j]+mod)%mod)%mod;
  56. g[size[x]-i+size[y]-j]%=mod;
  57. }
  58. }
  59. } else {
  60. for(register int i=;i<=size[x];i++) {
  61. for(register int j=;j<=size[y];j++) {
  62. g[i+j]
  63. +=(int64)f[x][i]
  64. *c[i+j][i]%mod
  65. *c[size[x]-i+size[y]-j][size[y]-j]%mod
  66. *sum[y][j]%mod;
  67. g[i+j]%=mod;
  68. }
  69. }
  70. }
  71. size[x]+=size[y];
  72. memcpy(f[x],g,sizeof g);
  73. }
  74. size[x]++;
  75. for(register int i=;i<=size[x];i++) {
  76. sum[x][i]=(sum[x][i-]+f[x][i-])%mod;
  77. }
  78. }
  79. int main() {
  80. prep();
  81. for(register int T=getint();T;T--) {
  82. init();
  83. const int n=getint();
  84. for(register int i=;i<n;i++) {
  85. const int u=getint(),sign=getchar(),v=getint();
  86. add_edge(u,v,sign=='<');
  87. }
  88. dp(,-);
  89. printf("%d\n",sum[][n]);
  90. }
  91. return ;
  92. }

[HEOI2013]SAO的更多相关文章

  1. 3167: [Heoi2013]Sao [树形DP]

    3167: [Heoi2013]Sao 题意: n个点的"有向"树,求拓扑排序方案数 Welcome to Sword Art Online!!! 一开始想错了...没有考虑一个点 ...

  2. 【BZOJ3167】[HEOI2013]SAO(动态规划)

    [BZOJ3167][HEOI2013]SAO(动态规划) 题面 BZOJ 洛谷 题解 显然限制条件是一个\(DAG\)(不考虑边的方向的话就是一棵树了). 那么考虑树型\(dp\),设\(f[i][ ...

  3. P4099 [HEOI2013]SAO

    P4099 [HEOI2013]SAO 贼板子有意思的一个题---我()竟然没看题解 有一张连成树的有向图,球拓扑序数量. 树形dp,设\(f[i][j]\)表示\(i\)在子树中\(i\)拓扑序上排 ...

  4. BZOJ 3167: [Heoi2013]Sao

    3167: [Heoi2013]Sao Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 96  Solved: 36[Submit][Status][D ...

  5. P4099 [HEOI2013]SAO(树形dp)

    P4099 [HEOI2013]SAO 我们设$f[u][k]$表示以拓扑序编号为$k$的点$u$,以$u$为根的子树中的元素所组成的序列方案数 蓝后我们在找一个以$v$为根的子树. 我们的任务就是在 ...

  6. 【BZOJ3167/4824】[Heoi2013]Sao/[Cqoi2017]老C的键盘

    [BZOJ3167][Heoi2013]Sao Description WelcometoSAO(StrangeandAbnormalOnline).这是一个VRMMORPG,含有n个关卡.但是,挑战 ...

  7. [HEOI2013]SAO(树上dp,计数)

    [HEOI2013]SAO (这写了一个晚上QAQ,可能是我太蠢了吧.) 题目说只有\(n-1\)条边,然而每个点又相互联系.说明它的结构是一个类似树的结构,但是是有向边连接的,题目问的是方案个数,那 ...

  8. 【做题记录】 [HEOI2013]SAO

    P4099 [HEOI2013]SAO 类型:树形 \(\text{DP}\) 这里主要补充一下 \(O(n^3)\) 的 \(\text{DP}\) 优化的过程,基础转移方程推导可以参考其他巨佬的博 ...

  9. [HEOI2013]SAO ——计数问题

    题目大意: Welcome to SAO ( Strange and Abnormal Online).这是一个 VR MMORPG, 含有 n 个关卡.但是,挑战不同关卡的顺序是一个很大的问题. 有 ...

  10. [BZOJ3167][P4099][HEOI2013]SAO(树形DP)

    题目描述 Welcome to SAO ( Strange and Abnormal Online).这是一个 VR MMORPG, 含有 n 个关卡.但是,挑战不同关卡的顺序是一个很大的问题. 有 ...

随机推荐

  1. MyBatis数据库字段和实体对象属性名不一致的解决方案

    数据库和对象的属性名不一致是很常见的问题,这个时候依从表字段到对象属性名的按名称匹配映射已经搞不定这个了,下面是几种解决方案. 1. 开启驼峰转换 如果数据库中的字段名与对象只是简单的不一致的话,比如 ...

  2. 手机网页的头部meta的相关配置~~

    今天使用sublime写手机端网页的时候,发现木有meta的自动生成手机网页的快捷键·~ 然后就去网上巴拉,准备存储一份~~哈哈 一.天猫 <title>天猫触屏版</title&g ...

  3. 使用vscode实现git同步

    用了git最方便的就是项目同步管理,回到家打开vscode只需要点击一下pull就能全部同步过来.是不是很方便....毕竟之前我都是拿u盘拷贝回家或者存到云盘再下载下来..   我这里之前用的是国内的 ...

  4. elk系列2之multiline模块的使用【转】

    preface 上回说道了elk的安装以及kibana的简单搜索语法,还有logstash的input,output的语法,但是我们在使用中发现了一个问题,我们知道,elk是每一行为一个事件,像Jav ...

  5. Java跨域问题的处理

    1,JavaScript由于安全性方面的考虑,不允许页面跨域调用其他页面的对象,那么问题来了,什么是跨域问题? 答:这是由于浏览器同源策略的限制,现在所有支持JavaScript的浏览器都使用了这个策 ...

  6. hosts,命令行前面的显示

    1,/etc/hosts,主机名ip配置文件. # Do not remove the following line, or various programs # that require netwo ...

  7. plsql实例精讲部分笔记

    转换sql: create or replace view v_sale(year,month1,month2,month3,month4,month5,month6,month7,month8,mo ...

  8. HDU 4614 Vases and Flowers(线段树+记录区间始末点或乱搞)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4614 题目大意:有n个空花瓶,有两种操作: 操作①:给出两个数字A,B,表示从第A个花瓶开始插花,插B ...

  9. MVC – 3.EF(Entity Framework)

    1.实体框架(EF)简介 与ADO.NET的关系 全称是ADO.NET Entity Framework,是微软开发的基于ADO.NET的ORM(Object/Relational Mapping)框 ...

  10. 【LOJ】#2129. 「NOI2015」程序自动分析

    题解 开始是想两个并查集的 和A相等,和A不相等 如果AB相等就连 A 相等,B相等 B不相等 A不相等 如果AB不相等就连 A不相等,B相等 B相等,A不相等 但是显然不对,因为和A不相等的不一定和 ...