当前位置: 首页 > news >正文

P4084 [USACO17DEC] Barn Painting G 题解

题目描述

Farmer John 有一个大农场,农场上有 N 个谷仓(1≤N≤105),其中一些已经涂色,另一些尚未涂色。Farmer John 想要为这些剩余的谷仓涂色,使得所有谷仓都被涂色,但他只有三种可用的油漆颜色。此外,他的获奖奶牛 Bessie 如果发现两个直接相连的谷仓颜色相同,会感到困惑,因此他希望确保这种情况不会发生。

保证 N 个谷仓之间的连接不会形成任何“环”。也就是说,任意两个谷仓之间最多只有一条连接路径。

Farmer John 有多少种方式可以为剩余的未涂色谷仓涂色?

输入格式

第一行包含两个整数 N 和 K(0≤K≤N),分别表示农场上的谷仓数量和已经涂色的谷仓数量。

接下来的 N−1 行每行包含两个整数 x 和 y(1≤x,y≤N,x=y),描述直接连接谷仓 x 和 y 的路径。

接下来的 K 行每行包含两个整数 b 和 c(1≤b≤N, 1≤c≤3),表示谷仓 b 已经被涂成颜色 c。

输出格式

计算为剩余谷仓涂色的有效方式数量,模 109+7,要求任何两个直接相连的谷仓颜色不同。

输入输出样例

输入 #1

4 1 1 2 1 3 1 4 4 3

输出 #1

8

思路:

依旧树形DP。

状态:dp[i][0]代表i涂第1种颜色的方法数,dp[i][1]代表i涂第2种颜色的方法数,dp[i][2]代表i涂第3种颜色的方法数。

状态转移方程:

dp[u][0]=dp[u][0]*(dp[v][2]+dp[v][1])%mod;
dp[u][1]=dp[u][1]*(dp[v][2]+dp[v][0])%mod;
dp[u][2]=dp[u][2]*(dp[v][1]+dp[v][0])%mod;

代码:

#include <bits/stdc++.h> #include <bits/c++config.h> #include <ostream> #include <istream> #include <algorithm> #include <string.h> #include <stdlib.h> #include <stdio.h> #include <string> #include <math.h> #include <time.h> #include <ctime> #include <cstdlib> #define ll long long #define ull unsigned long long #define db double #define st string #define ch char #define bo bool #define s1 27 #define s2 205 #define s3 2005 #define s4 20005 #define s5 200005 #define s6 2000005 #define s7 20000005 using namespace std; ll mod=1000000007; ll n,m,dp[s5][3],a[s5]; //dp[i][0]代表i涂第1种颜色,dp[i][1]代表i涂第2种颜色,dp[i][2]代表i涂第3种颜色。 vector<int> g[s5]; void dfs(int u,int fa){ if(a[u]==0){ for(int i=0;i<g[u].size();i++){ int v=g[u][i]; if(v==fa) continue; dfs(v,u); //dp[u][0] dp[u][0]=dp[u][0]*(dp[v][2]+dp[v][1])%mod; //dp[u][1] dp[u][1]=dp[u][1]*(dp[v][2]+dp[v][0])%mod; //dp[u][2] dp[u][2]=dp[u][2]*(dp[v][1]+dp[v][0])%mod; } } else if(a[u]!=0){ if(a[u]==1){ dp[u][1]=0; dp[u][2]=0; for(int i=0;i<g[u].size();i++){ int v=g[u][i]; if(v==fa) continue; dfs(v,u); dp[u][0]=dp[u][0]*(dp[v][2]+dp[v][1])%mod; } } else if(a[u]==2){ dp[u][2]=0; dp[u][0]=0; for(int i=0;i<g[u].size();i++){ int v=g[u][i]; if(v==fa) continue; dfs(v,u); dp[u][1]=dp[u][1]*(dp[v][2]+dp[v][0])%mod; } } else if(a[u]==3){ dp[u][1]=0; dp[u][0]=0; for(int i=0;i<g[u].size();i++){ int v=g[u][i]; if(v==fa) continue; dfs(v,u); dp[u][2]=dp[u][2]*(dp[v][1]+dp[v][0])%mod; } } } return ; } signed main(){ cin>>n>>m; for(int i=0;i<=100005;i++){ dp[i][1]=1; dp[i][0]=1; dp[i][2]=1; } for(int i=1;i<n;i++){ int k,c; cin>>k>>c; g[c].push_back(k); g[k].push_back(c); } for(int i=1;i<=m;i++){ int b,c; cin>>b>>c; a[b]=c; } dfs(1,0); cout<<(dp[1][0]+dp[1][1]%mod+dp[1][2]%mod)%mod<<endl; return 0; }
http://www.jsqmd.com/news/580392/

相关文章:

  • 再战学习
  • 旧Mac焕新:使用OpenCore Legacy Patcher让2008-2017年设备支持最新macOS系统
  • Qwen3-0.6B-FP8模型精讲:计算机组成原理知识问答效果实测
  • 突破效率瓶颈的5维解决方案:B站视频转文字全流程优化指南
  • 瑞祥商联卡回收服务全解析:让你的卡片不再闲置! - 团团收购物卡回收
  • Graphormer分子属性预测效果实测:CCO/CC(=O)O/c1ccccc1等10个SMILES预测结果
  • seo软文的配图应该如何选择_seo软文要注意哪些SEO优化点
  • 终极指南:如何无需Steam客户端轻松下载创意工坊模组
  • Gerbv:高效PCB设计验证的全流程Gerber查看工具
  • OpenClaw技能扩展实战:用Phi-3-vision自动生成图文周报
  • ”测试开发全日制学徒班7期第3天“-Linux常用命令之文件操作作业
  • 5分钟快速上手:Windows免费屏幕标注工具ppInk完全指南
  • defender-control:专业系统工具实现Windows安全管理新范式
  • 无障碍技术实践:OpenClaw+Phi-3-vision-128k-instruct构建语音图文助手
  • 数字人技术正在改变企业服务:一场静悄悄的效率革命
  • 软件授权机制逆向工程:基于RSA非对称加密的Beyond Compare密钥生成技术解析
  • 从开发到SRE:PyTorch 3.0静态图生产部署必须签署的4份SLA协议,及对应可观测性埋点清单
  • 瑞祥商联卡回收变现:快速兑现你的卡片价值! - 团团收购物卡回收
  • 直流微网中光伏发电与混合储能系统的下垂控制仿真探索
  • Windows Defender Remover技术指南:系统安全组件管理与优化方案
  • FLUX.1-dev像素艺术生成实战:像素幻梦在RPG地图设计中的落地应用
  • 全能扫描PDF文字化工具:OCRmyPDF让文档瞬间变智能
  • 动漫头像秒变真人!AnythingtoRealCharacters2511零基础5分钟上手教程
  • 重塑生命健康的数字防线:基于“云边端”协同的医疗垂直大模型赋能平台万字深度解构(WORD)
  • BaiduPanFilesTransfers:突破百度网盘批量操作瓶颈的效率工具
  • intv_ai_mk11多场景落地:用AI辅助‘无障碍网页描述生成’‘老年用户操作指引编写’
  • 如何高效处理闲置的瑞祥商联卡?一键回收变现攻略! - 团团收购物卡回收
  • Qwen3.5-9B-AWQ-4bit OCR辅助效果展示:手机截图/PDF扫描件文字识别精度实测
  • Pixel Mind Decoder 版本管理与协作:Git工作流在AI项目中的应用
  • Youtu-Parsing快速部署指南:一键启动Web服务,5分钟开始解析文档