题目描述

有一颗NN个节点的树,节点用1,2,\cdots,N1,2,⋯,N编号。你要给它染色,使得相邻节点的颜色不同。有MM种颜色,用1,2,\cdots,M1,2,⋯,M编号。每个节点可以染MM种颜色中的若干种,求不同染色方案的数量除以(10^9 + 7109+7)的余数。

输入输出格式

输入格式:

第1 行,2 个整数N,MN,M。

接下来NN行,第ii行表示节点ii可以染的颜色。第1个整数k_iki​,表示可以染的颜色数量。接下来k_iki​个整数,表示可以染的颜色编号。

最后N - 1N−1行,每行2个整数A_i,B_iAi​,Bi​,表示边(A_i,B_i)(Ai​,Bi​)。

输出格式:

1 个整数,表示所有的数。

输入输出样例

输入样例#1: 复制

2 2
1 1
2 1 2
1 2
输出样例#1: 复制

1

说明

• 对于30% 的数据,1 \le N \le 10; 1 \le M \le 41≤N≤10;1≤M≤4;

• 对于60% 的数据,1 \le N \le 200; 1 \le M \le 2001≤N≤200;1≤M≤200;

• 对于100% 的数据,1 \le N \le 5000; 1 \le M \le 50001≤N≤5000;1≤M≤5000。

思路:组合数学+树形DP。

f[i][j]表示在以i为根的子树中,当i号节点的颜色为j时的方案数。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define mod 1000000007
#define MAXN 5010
using namespace std;
int n,m,tot;
int ans[MAXN],f[][];
int to[MAXN*],net[MAXN*],head[MAXN*];
void add(int u,int v){
to[++tot]=v;net[tot]=head[u];head[u]=tot;
to[++tot]=u;net[tot]=head[v];head[v]=tot;
}
void dfs(int now,int fa){
for(int i=head[now];i;i=net[i])
if(to[i]!=fa)
dfs(to[i],now);
for(int i=;i<=m;i++)
if(f[now][i]){
for(int j=head[now];j;j=net[j])
if(to[j]!=fa)
f[now][i]=1LL*f[now][i]*(ans[to[j]]-f[to[j]][i])%mod;
while(f[now][i]<) f[now][i]+=mod;
ans[now]=(ans[now]+f[now][i])%mod;
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
int k;scanf("%d",&k);
for(int j=;j<=k;j++){
int q;scanf("%d",&q);
f[i][q]++;
}
}
for(int i=;i<n;i++){
int x,y;
scanf("%d%d",&x,&y);
add(x,y);
}
add(,);
dfs(,);
printf("%d",ans[]);
}

洛谷 P3914 染色计数的更多相关文章

  1. 洛谷——P3914 染色计数

    P3914 染色计数 题目描述 有一颗NN个节点的树,节点用1,2,\cdots,N1,2,⋯,N编号.你要给它染色,使得相邻节点的颜色不同.有MM种颜色,用1,2,\cdots,M1,2,⋯,M编号 ...

  2. 洛谷P1144-最短路计数-最短路变形

    洛谷P1144-最短路计数 题目描述: 给出一个\(N\)个顶点\(M\)条边的无向无权图,顶点编号为\(1-N\).问从顶点\(1\)开始,到其他每个点的最短路有几条. 思路: \(Dijkstra ...

  3. 洛谷P2486 染色

    LCT的一种姿势. 题意:给定一棵树.每次把一条路径上的点染成一种颜色,求一条路径上有多少段颜色. 解: 首先可以很轻易的用树剖解决,只不过代码量让人望而却步... 有一种难以想象的LCT做法... ...

  4. 洛谷——P1176 路径计数2

    P1176 路径计数2 题目描述 一个N \times NN×N的网格,你一开始在(1,1)(1,1),即左上角.每次只能移动到下方相邻的格子或者右方相邻的格子,问到达(N,N)(N,N),即右下角有 ...

  5. 洛谷 P1176 路径计数2

    P1176 路径计数2 题目描述 一个N×N的网格,你一开始在(1, 1),即左上角.每次只能移动到下方相邻的格子或者右方相邻的格子,问到达(N, N),即右下角有多少种方法. 但是这个问题太简单了, ...

  6. 洛谷 P3130 [USACO15DEC]计数haybalesCounting Haybales

    P3130 [USACO15DEC]计数haybalesCounting Haybales 题目描述 Farmer John is trying to hire contractors to help ...

  7. 洛谷 P2807 三角形计数

    P2807 三角形计数 题目背景 三角形计数(triangle) 递推 题目描述 把大三角形的每条边n等分,将对应的等分点连接起来(连接线分别平行于三条边),这样一共会有多少三角形呢?编程来解决这个问 ...

  8. 洛谷P1608 路径计数

    题目简介 题目描述 给你一个N点M边的有向图,求第一个点到第n个点的最短路和最短路条数 题目分析 很明显直接Dijkstra求最短路,加一个最短路计数 如下: if(dis[y]>dis[x]+ ...

  9. P3914染色计数

    题目描述 有一颗\(N\)个节点的树,节点用\(1,2,\cdots,N\)编号.你要给它染色,使得相邻节点的颜色不同.有\(M\)种颜色,用\(1,2,\cdots,M\)编号.每个节点可以染\(M ...

随机推荐

  1. js 事件监听,执行某操作

    <script language=javascript> var ie; var firefox; if (document.all) ie = true; else ie = false ...

  2. v4l2程序实例

    #include <stdio.h> #include <string.h> #include <errno.h> #include <stdlib.h> ...

  3. python--(常用模块-1)

    python--(常用模块-1) 一.模块的简单认识: 什么是模块,模块就是我们把装有特有功能的代码进行归类的结果,从代码编写的单位来看我们的程序,从小到大的顺序:一条代码<语句块<代码块 ...

  4. win10开机时内存使用率达到99%以上

    开始,运行,输入msconfig回车就能看到自启的项目. 搞定! 其实,感觉特别像是输入法的某个监听程序导致内存泄漏,造成的系统问题. 再遇到的时候要认真检查下.

  5. 浅谈密码加SALT原理

    我们知道,如果直接对密码进行散列,那么黑客可以对通过获得这个密码散列值,然后通过查散列值字典(例如MD5密码破解网站),得到某用户的密码.  加Salt可以一定程度上解决这一问题.所谓加Salt方法, ...

  6. 【codeforces 794C】Naming Company

    [题目链接]:http://codeforces.com/contest/794/problem/C [题意] 有n个位置; 两个人; 每个人都有n个字符组成的集合s1,s2(可以有重复元素); 然后 ...

  7. DCL授权命令

    create user 用户名//创建用户    grant DBA to 用户名//授权    revoke //撤销权限

  8. ASP.NET-RedirectToAction只能使用get方法

    两个同名Action共同使用return View() return RedirectToAction("test", new { ls = list.Fct_OrderList ...

  9. OSGI项目中获取文件路径

    假设想依据给定的文件名创建一个File实例,你可能会这么写: File file = new File(当前类.class.getResource("config").toURI( ...

  10. 研读:AirBag Boosting Smartphone Resistance to Malware Infection