[BZOJ4455][Zjoi2016]小星星
来源:互联网 发布:数据库设计视频教程 编辑:程序博客网 时间:2024/04/29 05:56
[Zjoi2016]小星星
Time Limit: 10 Sec Memory Limit: 512 MB
Submit: 60 Solved: 52
[Submit][Status][Discuss]
Description
小Y是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品。她有n颗小星星,用m条彩色的细线串了起来,每条细线连着两颗小星星。有一天她发现,她的饰品被破坏了,很多细线都被拆掉了。这个饰品只剩下了n-1条细线,但通过这些细线,这颗小星星还是被串在一起,也就是这些小星星通过这些细线形成了树。
小Y找到了这个饰品的设计图纸,她想知道现在饰品中的小星星对应着原来图纸上的哪些小星星。如果现在饰品中两颗小星星有细线相连,那么要求对应的小星星原来的图纸上也有细线相连。
小Y想知道有多少种可能的对应方式。只有你告诉了她正确的答案,她才会把小饰品做为礼物送给你呢。
Input
第一行包含个2正整数n,m,表示原来的饰品中小星星的个数和细线的条数。
接下来m行,每行包含2个正整数u,v,表示原来的饰品中小星星u和v通过细线连了起来。
这里的小星星从1开始标号。保证u≠v,且每对小星星之间最多只有一条细线相连。
接下来n-1行,每行包含个2正整数u,v,表示现在的饰品中小星星u和v通过细线连了起来。
保证这些小星星通过细线可以串在一起。
Output
输出共1行,包含一个整数表示可能的对应方式的数量。如果不存在可行的对应方式则输出0。
Sample Input
4 3
1 2
1 3
1 4
4 1
4 2
4 3
Sample Output
6
Solution
所有的映射方案视作一个集合
我们记
利用容斥原理即可
Code
#include <bits/stdc++.h>using namespace std;#define rep(i, l, r) for (int i = (l); i <= (r); i++)#define per(i, r, l) for (int i = (r); i >= (l); i--)#define MS(_) memset(_, 0, sizeof(_))#define MP make_pair#define PB push_back#define debug(...) fprintf(stderr, __VA_ARGS__)typedef long long ll;typedef pair<int, int> PII;typedef vector<int> VI;template<typename T> inline void read(T &x){ x = 0; T f = 1; char ch = getchar(); while (!isdigit(ch)) { if (ch == '-') f = -1; ch = getchar(); } while (isdigit(ch)) { x = x * 10 + ch - '0'; ch = getchar(); } x *= f;}int n, m, cnt, g[20][20], lst[20];ll dp[20][20];struct Node{int v; Node *nxt;}pool[200], *tail=pool, *last[20];inline void addedge(int u, int v){ tail->v = v; tail->nxt = last[u]; last[u] = tail++; tail->v = u; tail->nxt = last[v]; last[v] = tail++;}inline void dfs(int now, int fa){ for (Node *p = last[now]; p; p=p->nxt) if (p->v != fa) dfs(p->v, now); rep(u, 1, cnt){ dp[now][u] = 1ll; for (Node *p = last[now]; p; p=p->nxt) if (p->v != fa){ int son = p->v; ll ans = 0; rep(v, 1, cnt) if (g[lst[u]][lst[v]]) ans += dp[son][v]; dp[now][u] *= ans; } }}int main(){ scanf("%d%d", &n, &m); rep(i, 1, m){ int u, v; scanf("%d%d", &u, &v); g[u][v] = g[v][u] = 1; } rep(i, 1, n-1){ int u, v; scanf("%d%d", &u, &v); addedge(u, v); } ll ans = 0; for (int i = 0; i < (1<<n); i++){ cnt = 0; rep(j, 1, n) if (!(i&(1<<(j-1)))) lst[++cnt] = j; dfs(1, 0); ll res = 0; rep(j, 1, cnt) res += dp[1][j]; if (__builtin_popcount(i)&1) ans -= res; else ans += res; } printf("%lld\n", ans); return 0; }
- [BZOJ4455][Zjoi2016]小星星
- 【bzoj4455】[Zjoi2016]小星星
- BZOJ4455 [Zjoi2016]小星星
- bzoj4455 ZJOI2016 小星星
- [BZOJ4455][Zjoi2016]小星星(容斥原理+树形dp)
- [BZOJ4455][Zjoi2016]小星星(容斥原理+树形DP)
- [ZJOI2016]小星星
- bzoj 4455: [Zjoi2016]小星星
- UOJ 185【ZJOI2016】小星星
- BZOJ 4455: [Zjoi2016]小星星
- 4455: [Zjoi2016]小星星
- [UOJ#185][ZJOI2016] 小星星
- 【bzoj3349】[Zjoi2016]小星星
- bzoj 4455: [Zjoi2016]小星星
- bzoj 4455: [Zjoi2016]小星星
- 【BZOJ4455】小星星,容斥原理+树形DP
- BZOJ 4455 & UOJ 185 [ZJOI2016]小星星
- [zjoi2016][小星星][容斥]解题报告
- weakself and strongself
- 1001. A+B Format (20)
- 史上最全的iOS面试题及答案
- 2016-03-29 Spring框架
- 微软笔试题
- [BZOJ4455][Zjoi2016]小星星
- 贰零壹陆年叁月 写下我工作以来的第一篇博客
- 第五周项目4-长方柱类
- hdoj--1069 Monkey and Banana(dp)
- java正则表达式(一)
- Android命名规范
- ngDialog 弹出层关闭
- redhat6安装chrome
- 浮点水题hdoj2014这题之前做了很多次错了很多次纪念一番~