HDU5416(树DP)
2015-10-06 17:20
295 查看
比较水,坑点是答案要爆int。
#include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <iostream> #include <vector> using namespace std; #define maxn 511111 #define maxm 1111111 #define INF 111111111 struct node { int from, to, next, w; }edge[maxm]; int head[maxn], sum[maxn]; //异或和 int cnt[maxn]; int e, n; void add_edge (int from, int to, int w, int i) { node &e = edge[i]; e.from = from, e.to = to, e.w = w, e.next = head[from], head[from] = i; } void dfs (int u, int fa) { for (int i = head[u]; i != -1; i = edge[i].next) { int v = edge[i].to; if (v == fa) continue; sum[v] = sum[u]^edge[i].w; dfs (v, u); } } int main () { int t; scanf ("%d", &t); while (t--) { scanf ("%d", &n); memset (cnt, 0, sizeof cnt); memset (head, -1, sizeof head); e = 0; int u, v, w; for (int i = 1; i < n; i++) { scanf ("%d%d%d", &u, &v, &w); add_edge (u, v, w, e++); add_edge (v, u, w, e++); } memset (sum, 0, sizeof sum); dfs (1, 0); for (int i = 1; i <= n; i++) { cnt[sum[i]]++; } //for (int i = 1; i <= n; i++) cout << sum[i] << " "; cout <<endl; int q; scanf ("%d", &q); while (q--) { scanf ("%d", &w); long long ans = 0; for (int i = 1; i <= n; i++) { int gg = w^sum[i]; if (sum[i] == gg) ans++; ans += cnt[gg]; } printf ("%lld\n", ans/2); } } return 0; }
相关文章推荐
- C++初始化变量
- jQuery源码分析之$.grep()函数四问
- opencv环境的搭建,并打开一个本地PC摄像头。
- Socket所有的网络通信模型详解共享
- div、p等标签不自动折行
- Log Malicious Discovery tool (Log-MD)
- RenderScript的基础使用
- 黑马程序员----Objective-C学习笔记之@property参数
- 让 Putty 保存密码,自动登陆的四种方法
- matlab边缘检测算法汇总2
- 第三周Linux编程实例练习
- [wordpress使用]002_主题
- public static void main(String[] args){}函数
- 一元多项式的乘法与加法运算【Java实现--通过单项链表实现队列】
- eclipse下建立 android 项目,相关文件夹介绍
- Mac下如何安装调试apk
- foj2204 圆环没有连续7个黑或白的可能数
- Node.JS学习笔记: 基础篇
- HTTP协议漫谈
- (转)HTTP协议漫谈