1382 - The Queue
Time Limit: 2 second(s) Memory Limit: 32 MB

On some special occasions Nadia's company provide very special lunch for all employees of the company. Before the food is served all of the employees must stand in a queue in front of the food counter. The company applied a rule for standing in the queue. The rule is nobody can stand anywhere in front of his supervisor in the queue. For example, if Abul is the supervisor of Babul and Abul stands in kth position from the front of the queue, then Babul cannot stand at any position in between 1 and k - 1 from front of the queue.

The company has N employees and each of them has exactly one supervisor except one (CEO) who doesn't have any supervisor.

You have to calculate in how many ways the queue can be created. For this problem, you can safely assume that in at least one way the queue can be created.

Input

Input starts with an integer T (≤ 700), denoting the number of test cases.

Each case starts with a line containing an integer N (1 ≤ N ≤ 1000). Each of the following N - 1 lines will contain two integers a and b (1 ≤ a, b ≤ N, a ≠ b), which denotes that a is the supervisor of b. For the sake of simplicity we are representing each employee by an integer number. Assume that the given input follows the restrictions stated above.

Output

For each case, print the case number and the number of ways to create the queue. The result can be large, print the result modulo 1000 000 007.

Sample Input

Output for Sample Input

1

5

2 1

2 3

3 4

3 5

Case 1: 8


Problem Setter: Md. Arifuzzaman Arif
Special Thanks: Jane Alam Jan
题意:N个人,其中每个人都有一个上司,除了最高的上司。问将这些人排列,并且满足如果上司必须排在在他管辖的人的前面,问有多少种排列的方法。
一开始想,这个有点像拓扑排序,然后再排列,后来感觉不对.
思路:树形DP
每个人只有一个上司,并且只有一个最大的boss,所以这些点可以构成一棵树。
然后先考虑如果有一个根节点,下面有两个节点,那么我们可以把这三个合并成一个点,方案数为dp[v1]*dp[v2]*(C(size(v1)+size(v2,size(v1))));
可以这样理解这个方程:dp[v1]是节点v1的合法的排列种数,同理dp[v2];那么当前的总个数为size[v1]+size[v2]+1;1为这两个点的上面的根节点,这样在合并的这些节点种取size[v1]个
放v1下面的所有点那么剩下的就放v2所以合法数就是dp[v1]*dp[v2]*(C(size(v1)+size(v2,size(v1))));这样一直合并到boss就是最终结果;用dfs去实现dp复杂度O(n+E);
 1 #include<stdio.h>
2 #include<algorithm>
3 #include<iostream>
4 #include<string.h>
5 #include<queue>
6 #include<stack>
7 #include<vector>
8 using namespace std;
9 typedef long long LL;
10 const int N=1e9+7;
11 vector<int>vec[1100];
12 queue<int>que;
13 int ans[2100];
14 LL dp[1100];
15 LL cnt[1100];
16 LL ju[1100][1100];
17 void dfs(int n);
18 int main(void)
19 {
20 int k,i,j;
21 ju[0][0]=1;
22 ju[1][0]=1;
23 ju[1][1]=1;
24 for(i=2; i<=1099; i++)
25 {
26 for(j=0; j<=i; j++)
27 {
28 if(i==j||j==0)
29 ju[i][j]=1;
30 else ju[i][j]=(ju[i-1][j]+ju[i-1][j-1])%N;
31 }
32 }
33 scanf("%d",&k);
34 int s;
35 int n,m;
36 int x,y;
37 for(s=1; s<=k; s++)
38 {
39 for(i=0; i<1050; i++)
40 {
41 dp[i]=1;
42 vec[i].clear();
43 }
44 scanf("%d",&n);
45 for(i=1; i<=n; i++)
46 cnt[i]=i;
47 for(i=1; i<n; i++)
48 {
49 scanf("%d %d",&x,&y);
50 vec[x].push_back(y);
51 cnt[y]=x;
52 }
53 int id=1;
54 memset(ans,0,sizeof(ans));
55 for(i=1; i<=n; i++)
56 {
57 if(cnt[i]==i)
58 id=i;
59 }
60 memset(ans,0,sizeof(ans));
61 dfs(id);
62 printf("Case %d: ",s);
63 printf("%lld\n",dp[id]);
64 }
65 return 0;
66 }
67 void dfs(int n)
68 {
69 if(!vec[n].size())
70 {
71 ans[n]=1;
72 dp[n]=1;
73 return ;
74 }
75 int cc=vec[n].size();
76 int i,j;
77 LL ak=0;
78 ans[n]+=1;
79 for(i=0; i<vec[n].size(); i++)
80 {
81 dfs(vec[n][i]);
82 ans[n]+=ans[vec[n][i]];
83 dp[n]=(dp[vec[n][i]]*dp[n]%N)*(ju[ans[n]-1][ans[vec[n][i]]])%N ;
84 }
85 }

1382 - The Queue的更多相关文章

  1. lightoj 1382 - The Queue(树形dp)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1382 题解:简单的树形dp加上组合数学. #include <iostr ...

  2. [数据结构]——链表(list)、队列(queue)和栈(stack)

    在前面几篇博文中曾经提到链表(list).队列(queue)和(stack),为了更加系统化,这里统一介绍着三种数据结构及相应实现. 1)链表 首先回想一下基本的数据类型,当需要存储多个相同类型的数据 ...

  3. Azure Queue Storage 基本用法 -- Azure Storage 之 Queue

    Azure Storage 是微软 Azure 云提供的云端存储解决方案,当前支持的存储类型有 Blob.Queue.File 和 Table. 笔者在<Azure File Storage 基 ...

  4. C++ std::queue

    std::queue template <class T, class Container = deque<T> > class queue; FIFO queue queue ...

  5. 初识Message Queue之--基础篇

    之前我在项目中要用到消息队列相关的技术时,一直让Redis兼职消息队列功能,一个偶然的机会接触到了MSMQ消息队列.秉着技术还是专业的好为原则,对MSMQ进行了学习,以下是我个人的学习笔记. 一.什么 ...

  6. 搭建高可用的rabbitmq集群 + Mirror Queue + 使用C#驱动连接

    我们知道rabbitmq是一个专业的MQ产品,而且它也是一个严格遵守AMQP协议的玩意,但是要想骚,一定需要拿出高可用的东西出来,这不本篇就跟大家说 一下cluster的概念,rabbitmq是erl ...

  7. PriorityQueue和Queue的一种变体的实现

    队列和优先队列是我们十分熟悉的数据结构.提供了所谓的“先进先出”功能,优先队列则按照某种规则“先进先出”.但是他们都没有提供:“固定大小的队列”和“固定大小的优先队列”的功能. 比如我们要实现:记录按 ...

  8. C#基础---Queue(队列)的应用

       Queue队列,特性先进先出. 在一些项目中我们会遇到对一些数据的Check,如果数据不符合条件将会把不通过的信息返回到界面.但是对于有的数据可能会Check很多条件,如果一个数据一旦很多条件不 ...

  9. [LeetCode] Queue Reconstruction by Height 根据高度重建队列

    Suppose you have a random list of people standing in a queue. Each person is described by a pair of ...

随机推荐

  1. 从 ClickHouse 到 ByteHouse:实时数据分析场景下的优化实践

    本文来自火山引擎公众号,原文发布于2021-09-06. 近日,字节跳动旗下的企业级技术服务平台火山引擎正式对外发布「ByteHouse」,作为 ClickHouse 企业版,解决开源技术上手难 &a ...

  2. flink-----实时项目---day06-------1. 获取窗口迟到的数据 2.双流join(inner join和left join(有点小问题)) 3 订单Join案例(订单数据接入到kafka,订单数据的join实现,订单数据和迟到数据join的实现)

    1. 获取窗口迟到的数据 主要流程就是给迟到的数据打上标签,然后使用相应窗口流的实例调用sideOutputLateData(lateDataTag),从而获得窗口迟到的数据,进而进行相关的计算,具体 ...

  3. Linux磁盘分区(四)之分区大小调整

    Linux磁盘分区(四)之分区大小调整在学习调整分区大小之前,先了解linx分区的概念.参考如下博客:[1]linux 分区 物理卷 逻辑卷 https://www.cnblogs.com/liuch ...

  4. android studio 生成aar和引用aar

    以android studio 2.0正式版为例 1.aar包是Android studio下打包android工程中src.res.lib后生成的aar文件,aar包导入其他android stud ...

  5. 4.2 rust 命令行参数

     从命令行读取参数 use std::env; fn main() { let args: Vec<String> = env::args().collect(); println!(&q ...

  6. Default Assignment Operator and References

    We have discussed assignment operator overloading for dynamically allocated resources here . This is ...

  7. JDBC(3):PreparedStatement对象介绍

    一,PreparedStatement介绍 PreperedStatement是Statement的子类,它的实例对象可以通过Connection.preparedStatement()方法获得,相对 ...

  8. 使用mybatis更新数据时 时间字段的值自动更新

    1.debug打印出来执行的sql语句发现并没有修改时间的字段,最后发现是设计表时勾选了根据当前时间戳更新..... 去掉该字段的根据当前时间戳更新语句: alter table tableName ...

  9. navicat突然连接不上远程linux服务器上的mysql

    我linux服务器上的mysql是docker安装的,突然有一天我的navicat连接不上服务器上的mysql,于是开始了下面一系列的修复 1.首先登录服务器上mysql,看是否能正常登录,我发现不能 ...

  10. maven管理本地jar包

    maven作为包管理工具,好处不必多说.但是有些情况,比如需要引入第三方包,如快递鸟,支付宝,微信等jar包(当然有可能直接提供maven依赖),如果直接下载到本地之后,怎么整合到自己的maven工程 ...