2018牛客网暑假ACM多校训练赛(第三场)G Coloring Tree 计数,bfs

时间:2022-09-21 08:48:31

原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-G.html

题目传送门 - 2018牛客多校赛第三场 G

题意

  给定一个 $n$ 个节点的树,有 $k$ 种颜色。

  现在让你给每一个节点都染上一种颜色,总共有 $k^n$ 种方法。

  现在问,在所有染色方案中,使得相同颜色点对之间的最短距离为 $D$ 的有多少种方案。

  答案对于 $10^9+7$ 取模。

  $n,k,d\leq 5000$

题解

  首先我们来算一下相同颜色点对之间的最短距离不小于 $D$ 的情况。

  我们考虑 bfs 。

  对于当前节点,我们找出已经访问过的节点中与当前节点的距离小于 $D$ 的节点。

  由于我们是 bfs 的,可以证明找出的这些节点任意两个之间的距离一定小于 $D$ 。所以这些节点的颜色互不相同。

  记这些节点的总个数为 $cnt$ ,则当前节点可以染的颜色种数为 $k-cnt$ 。

  那么答案就累乘一下就可以了。

  时间复杂度 $O(n^2)$ 。

  但是我们要求的是等于 $D$ 的情况。

  怎么做?

  减掉大于 $D$ 的情况种数即可。

代码

#include <bits/stdc++.h>
using namespace std;
const int N=5005,mod=1e9+7;
struct Gragh{
static const int M=N*2;
int cnt,y[M],nxt[M],fst[N];
void clear(){
cnt=0;
memset(fst,0,sizeof fst);
}
void add(int a,int b){
y[++cnt]=b,nxt[cnt]=fst[a],fst[a]=cnt;
}
}g;
int n,k,D;
int vis[N],Q[N],head,tail;
int cnt1,cnt2;
void dfs(int x,int pre,int d){
if (d>D+1)
return;
if (d<=D)
cnt1++;
cnt2++;
for (int i=g.fst[x];i;i=g.nxt[i])
if (g.y[i]!=pre&&vis[g.y[i]])
dfs(g.y[i],x,d+1);
}
int main(){
scanf("%d%d%d",&n,&k,&D),D--;
g.clear();
for (int i=1,a,b;i<n;i++){
scanf("%d%d",&a,&b);
g.add(a,b);
g.add(b,a);
}
memset(vis,0,sizeof vis);
head=tail=0;
Q[++tail]=1;
int ans1=1,ans2=1;
while (head<tail){
int x=Q[++head];
vis[x]=1,cnt1=cnt2=-1;
dfs(x,0,0);
cnt1=max(k-cnt1,0),cnt2=max(k-cnt2,0);
ans1=1LL*ans1*cnt1%mod;
ans2=1LL*ans2*cnt2%mod;
for (int i=g.fst[x];i;i=g.nxt[i])
if (!vis[g.y[i]])
Q[++tail]=g.y[i];
}
printf("%d",(ans1-ans2+mod)%mod);
return 0;
}

  

2018牛客网暑假ACM多校训练赛(第三场)G Coloring Tree 计数,bfs的更多相关文章

  1. 2018牛客网暑假ACM多校训练赛(第二场)E tree 动态规划

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round2-E.html 题目传送门 - 2018牛客多校赛第二场 E ...

  2. 2018牛客网暑假ACM多校训练赛(第三场)I Expected Size of Random Convex Hull 计算几何&comma;凸包&comma;其他

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-I.html 题目传送门 - 2018牛客多校赛第三场 I ...

  3. 2018牛客网暑假ACM多校训练赛(第三场)D Encrypted String Matching 多项式 FFT

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-D.html 题目传送门 - 2018牛客多校赛第三场 D ...

  4. 2018牛客网暑假ACM多校训练赛(第十场)H Rikka with Ants 类欧几里德算法

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round10-H.html 题目传送门 - https://www.n ...

  5. 2018牛客网暑假ACM多校训练赛(第十场)F Rikka with Line Graph 最短路 Floyd

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round10-F.html 题目传送门 - https://www.n ...

  6. 2018牛客网暑假ACM多校训练赛(第十场)D &Tab;Rikka with Prefix Sum 组合数学

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round10-D.html 题目传送门 - https://www.n ...

  7. 2018牛客网暑假ACM多校训练赛(第八场)H Playing games 博弈 FWT

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round8-H.html 题目传送门 - https://www.no ...

  8. 2018牛客网暑假ACM多校训练赛(第七场)I Tree Subset Diameter 动态规划 长链剖分 线段树

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round7-I.html 题目传送门 -  https://www.n ...

  9. 2018牛客网暑假ACM多校训练赛(第六场)I Team Rocket 线段树

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round6-I.html 题目传送门 - https://www.no ...

随机推荐

  1. 你必须知道的Microsoft SQL Server一

    不知道为什么我Win10环境下安装的Sqlserver2012,智能提示的功能基本上没有用,没办法,我还是选择安装插件SQL Prompt 5吧.下载地址:http://www.uzzf.com/so ...

  2. mysql exists 和 in的效率比较

    这条语句适用于a表比b表大的情况 select * from ecs_goods a where cat_id in(select cat_id from ecs_category b); 这条语句适 ...

  3. SQL中Group By 的使用

    1.概述 “Group By”从字面意义上理解就是根据“By”指定的规则对数据进行分组,所谓的分组就是将一个“数据集”划分成若干个“小区域”,然后针对若干个“小区域”进行数据处理. 2.原始表 3.简 ...

  4. android私有文件夹的访问

    首先内部存储路径为/data/data/youPackageName/,下面讲解的各路径都是基于你自己的应用的内部存储路径下. 所有内部存储中保存的文件在用户卸载应用的时候会被删除. 一. files ...

  5. hdu 3635 Dragon Balls &lpar;带权并查集&rpar;

    Dragon Balls Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  6. Python中的闭包

    简单的闭包的栗子: def counter(statr_at = 0): count = 1 def incr(): nonlocal count #注意由于count类型为immutable,所以需 ...

  7. SQL where 1&equals;1的作用

    浅谈where 1=1 1.简单理解的话where 1=1 永真, where 1<>1 永假 2.1<>1 的用处:     用于只取结构不取数据的场合     例如:    ...

  8. 在Struts2中集成Spring详细讲解

    Spring的官方定义是:一个轻量级的IoC和Aop容器框架,它使用了一种叫做依赖注入的技术. 所谓依赖注入,就是指将创建对象以及协议依赖对象之间合作的责任从对象自身中转移到"工厂&quot ...

  9. 201521123064 《Java程序设计》第7周学习总结

    1. 本章学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 参考资料: XMind 2. 书面作业 Q1:ArrayList代码分析 1.1 解释ArrayList的contains源 ...

  10. CentOs7相对于CentOs6的常用命令变化

    比如说防火墙在CentOS6中为 iptables,在CentOS7中变为 firewalld. service iptables stop/start/restart systemctl stop/ ...