多彩的树 ssl2658 dfs+容斥原理
来源:互联网 发布:linux中vi常用命令 编辑:程序博客网 时间:2024/06/06 20:58
Description
我们将给出一颗有N个节点的树,每个节点都有一个颜色,你可以任意选择一个节点作为起点,并通向它所能到达的节点,然后最终停在一个终点上(起点和终点可能相同),当然了每一个结点只能经过一次,叶子的颜色种类为K。请问有多少种不同的方案可以使得你经过的节点的颜色正好为K种?(两种方案不同当且仅当起点不同或终点不同)。
Solution
我果然还是太弱了
k只有10,那么考虑用容斥原理。考虑去掉颜色的限制,那么一棵n节点的树总路径为
复杂度
然后还可以点分治的,但是不会
我果然还是太弱了
Code
#include <stdio.h>#include <string.h>#include <vector>#define rep(i, st, ed) for (int i = st; i <= ed; i += 1)#define erg(i, st) for (int i = ls[st]; i; i = e[i].next)#define fill(x, t) memset(x, t, sizeof(x))#define ll long long#define N 50001#define E N << 1 | 1struct edge{int x, y, next;}e[E];int ls[N];inline void addEdge(int &cnt, int x, int y){ cnt += 1; e[cnt] = (edge){x, y, ls[x]}; ls[x] = cnt; cnt += 1; e[cnt] = (edge){y, x, ls[y]}; ls[y] = cnt;}int vis[N], c[N];int size;inline void getAns(int now, int col){ vis[now] = 1; size += 1; erg(i, now){ if (!vis[e[i].y] && !(col & c[e[i].y])){ getAns(e[i].y, col); } }}using std:: vector;vector<int> sch, poe;inline void dfsCol(int foe, int dep, int col, int m){ if (dep == m){ sch.push_back(col); poe.push_back(foe); }else{ dfsCol(foe, dep + 1, col, m); dfsCol(-foe, dep + 1, col | (1 << dep), m); }}int main(void){ int n, m; scanf("%d%d", &n, &m); rep(i, 1, n){ int tmp; scanf("%d", &tmp); c[i] = 1 << (tmp - 1); } int edgeCnt = 0; rep(i, 2, n){ int x, y; scanf("%d%d", &x, &y); addEdge(edgeCnt, x, y); } dfsCol(1, 0, 0, m); ll ans = 0; rep(i, 0, sch.size() - 1){ fill(vis, 0); rep(st, 1, n){ if (!vis[st] && !(sch[i] & c[st])){ size = 0; getAns(st, sch[i]); ans += (ll) (size * size * poe[i]); // printf("%d %d\n", size * size * poe[i], sch[i]); } } } printf("%lld\n", ans); return 0;}
1 0
- 多彩的树 ssl2658 dfs+容斥原理
- hdu1796(容斥原理+最大公约数+DFS)
- HDU4135 容斥原理+质因子+DFS
- bzoj1853 幸运数字 容斥原理&dfs
- BZOJ 2393 Cirno的完美算数教室 容斥原理+DFS
- [BZOJ2393]Cirno的完美算数教室(容斥原理+DFS)
- 数学 hdu1796(容斥原理+dfs) / (容斥原理+二进制枚举)
- HOJ 2576 Simple Calculation 容斥原理(DFS)
- HDU_1695_GCD(欧拉函数+容斥原理+DFS)
- BZOJ 1853 SCOI2010 幸运数字 容斥原理+DFS
- [BZOJ 1853][SCOI 2010]幸运数字(容斥原理+DFS)
- HDU 5468 Puzzled Elena(DFS序+容斥原理)
- HDU 5468 Puzzled Elena(容斥原理+dfs)
- hdu5514 容斥原理 + dfs + 抵消减枝
- 广东工业大学网络赛F题, 容斥原理+DFS
- hdu5468 Puzzled Elena(容斥原理+dfs序)
- HYSBZ-1853 幸运数字(容斥原理,dfs)
- 容斥原理的证明
- hibernate教程--一级缓存详解
- tensorflow安装时遇到的问题
- leetcode:338. Counting Bits
- 蓝桥杯2016年第七届决赛C_C++程序设计本科B组
- hdu4819_Mosaic_二维线段树(及二维线段树的概念的理解)
- 多彩的树 ssl2658 dfs+容斥原理
- struts2中的result用法
- android相关知识
- 通过Spring Boot构建项目工程
- OC消息转发机制
- 不重复数据字段统计
- Struts2基础总结
- bzoj1303: [CQOI2009]中位数图
- bzoj4826 [Hnoi2017]影魔