hdu 5606
2016-01-03 10:44
211 查看
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
const int maxn = 1e5+10;
int f[maxn];
int flag[maxn];
int find(int x)
{
return x==f[x]?x:f[x] = find(f[x]);
}
void unit(int x,int y)
{
int bossx = find(x);
int bossy = find(y);
if(bossx!=bossy)
{
f[bossx]=bossy;
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
int x,y,z;
for(int i= 1;i<=n;i++)
f[i] = i;
for(int i =1 ; i<n; i++)
{
scanf("%d%d%d",&x,&y,&z);
if(z==0)
{
unit(x,y);
}
}
memset(flag,0,sizeof(flag));
for(int i = 1; i<=n; i++)
{
f[i] = find(i);
flag[f[i]]++;
}
int ans = 0;
for(int i =1; i<=n; i++)
{
ans = flag[f[i]]^ans;
}
printf("%d\n",ans);
}
return 0 ;
}
去掉边值为一的边,计算出每个点所在联通图里的点的总个数就是离他最近的点
tree
] Accepts: 143Submissions: 807
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
问题描述
有一个树(nn个点, n-1n−1条边的联通图),点标号从11~nn,树的边权是00或11.求离每个点最近的点个数(包括自己).
输入描述
第一行一个数字TT,表示TT组数据. 对于每组数据,第一行是一个nn,表示点个数,接下来n-1n−1,每行三个整数u,v,wu,v,w,表示一条边连接的两个点和边权. T = 50,1 \leq n \leq 100000, 1 \leq u,v \leq n,0 \leq w \leq 1T=50,1≤n≤100000,1≤u,v≤n,0≤w≤1.
输出描述
对于每组数据,输出答案. 考虑到输出规模过大,设ans_iansi表示第ii个点的答案.你只需输出ans_1 \ xor \ ans_2 \ xor \ ans_3.. \ xor \ ans_nans1 xor ans2 xor ans3.. xor ansn即可.
输入样例
1 3 1 2 0 2 3 1
输出样例
1
Hint
ans_1 = 2ans1=2 ans_2 = 2ans2=2 ans_3 = 1ans3=1 2 \ xor \ 2 \ xor \ 1=12 xor 2 xor 1=1, 因此输出11.
相关文章推荐
- matlab中sort函数的用法
- bzoj 2330 [SCOI2011]糖果(差分约束系统)
- 读《重构》1~3章
- Kaggle:What's Cooking?
- JavaScript:void(0);的作用
- Struts2 web.xml文件配置
- QT编译出错解决方法
- Python 决定迁移到 GitHub
- JavaScript进阶(二)在一个JS文件中引用另一个JS文件
- matlab中repmat函数的用法
- JavaScript进阶(二)在一个JS文件中引用另一个JS文件
- C#编程中的三中结构
- HIbernate inverse和cascade属性
- 《Monkey Android》第15课Spinner和AutoCompleteTextView
- 大数据工程师为什么要学习scala
- 一起talk C栗子吧(第八十八回:C语言实例--使用管道进行进程间通信一)
- AFN网络框架2.x版—返回XML的情况
- 约瑟夫问题 三种实现方法
- JavaScript进阶(一)抽离公共函数
- JavaScript进阶(一)抽离公共函数