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

QOJ856 Cactus 广义串并联图

题意

给定一棵仙人掌, 你需要用 \(k\) 种颜色给每个结点染色, 且保证有边相连的结点的颜色不相同, 求染色的方案数对 \(10^9+7\) 取模的结果。仙人掌定义为一张特殊的无向图, 其中每条边至多在一个简单环上。

题解

因为是仙人掌,考虑广义串并联图方法。
对每条广义串并联图上的边,记 \(f,g\) 分别表示已确定两端点颜色,两端点颜色相同两端点颜色不同的方案数。考虑如何压缩:

  • 叠合重边:\(f,g\) 分别相乘即可。
  • \(1\) 度点:将答案乘上 \(f+(k-1)g\) 即可。
  • \(2\) 度点:记两条边分别为 \(u,v\),则合并以后边的 \(f=f_uf_v+g_ug_v(k-1),\ g=f_ug_v+g_uf_v+g_ug_v(k-2)\)

最后再将答案乘上 \(k\) 就做完了。

参考代码:

#include<bits/stdc++.h>
#define ll long long
#define mxn 300003
#define md 1000000007
#define pb push_back
#define mkp make_pair
#define ld long double
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define rept(i,a,b) for(int i=(a);i<(b);++i)
#define drep(i,a,b) for(int i=(a);i>=(b);--i)
using namespace std;
int T,n,m,k;
map<int,pair<ll,ll>>mp[mxn];
queue<int>q;
ll ans;
inline void add(int x,int y,ll f,ll g){if(mp[x].find(y)!=mp[x].end()){auto d=mp[x][y];mp[x][y]=mp[y][x]={f*d.first%md,g*d.second%md};}else mp[x][y]=mp[y][x]={f,g};
}
void solve(){scanf("%d%d%d",&n,&m,&k);rep(i,1,n)mp[i].clear();ans=1;for(int i=0,x,y;i<m;++i){scanf("%d%d",&x,&y);add(x,y,0,1);}rep(i,1,n)if(mp[i].size()<3)q.push(i);while(q.size()){int x=q.front();q.pop();if(mp[x].size()==1){ans=(mp[x].begin()->second.first+mp[x].begin()->second.second*(k-1))%md*ans%md;}else if(mp[x].size()==2){auto it=mp[x].begin();int y1=it->first;auto z1=it->second;it++;int y2=it->first;auto z2=it->second;add(y1,y2,(z1.first*z2.first+z1.second*z2.second%md*(k-1))%md,(z1.first*z2.second+z1.second*z2.first+z1.second*z2.second%md*(k-2))%md);}for(auto i:mp[x]){mp[i.first].erase(x);if(mp[i.first].size()<3)q.push(i.first);}mp[x].clear();}cout<<ans*k%md<<'\n';
}
signed main(){scanf("%d",&T);while(T--)solve();return 0;
}
http://www.hskmm.com/?act=detail&tid=26976

相关文章:

  • CF2152 订题
  • 静态路由
  • Kruskal 重构树学习笔记
  • GJ Round 2025赛季
  • ASP.NET Core 中读取 UserAgent 的正确姿势
  • vLLM推理加速指南:7个技巧让QPS提升30-60%
  • Git学习记录(二):代码patch
  • 2025年10月化妆品代工厂最新推荐排行榜:聚焦 OEM/ODM/ 网红爆款需求,精选优质企业助品牌高效合作
  • Exchange安全漏洞分析:ProxyOracle攻击链详解
  • 牛客 周赛111 20251008
  • 本人于2025上半学期编码需要遵守的规范(参考腾讯内部编码规范)
  • 10.8 CSP-JS 模拟赛 T5. xor
  • 防抖 解释
  • 从零到一搭建:vue3+vite7+antfu+stylelint+githooks,全流程配置,附带源码,集成css变量使用,下载即用
  • bat批处理脚本文件-获取当前时间的几种方法
  • 二分图最大权完美匹配 KM算法
  • 2025.10.8模拟赛
  • Python 中的排序排序函数及区别
  • RL | 速读 IJCAI 2025 的强化学习论文
  • IDM弹窗解决 - -一叶知秋
  • PHP+MySQL开发语言 在线下单订水送水小脚本源码及搭建指南
  • Sliding Window Algorithm
  • 国庆模拟赛总结
  • 深入解析:video-audio-extractor:视频转换为音频
  • 10.8 CSP-JS 模拟赛 T4. discover
  • 20251008 模拟测 总结
  • VuePress v2是否支持Vue2的配置?
  • 新人UP主:晓牛开发者的第一篇自我介绍博客测试发布
  • ubuntu20.04服务器版安装中文输入法分享
  • DeCLIP