Tree(HDU-5060)
Problem Description
There is a tree(the tree is a connected graph which contains n points and n?1 edges),the points are labeled from 1 to n,which edge has a weight from 0 to 1,for every point i∈[1,n],you should find the number of the points which are closest to it,the clostest points can contain i itself.
Input
the first line contains a number T,means T test cases.
for each test case,the first line is a nubmer n,means the number of the points,next n-1 lines,each line contains three numbers u,v,w,which shows an edge and its weight.
T≤50,n≤105,u,v∈[1,n],w∈[0,1]
Output
for each test case,you need to print the answer to each point.
in consideration of the large output,imagine ansi is the answer to point i,you only need to output,ans1 xor ans2 xor ans3.. ansn.
Sample Input
1
3
1 2 0
2 3 1
Sample Output
1
Hint
in the sample.
- ans_1=2
- ans_2=2
- ans_3=1
2~xor~2~xor~1=1,so you need to output 1.
題意:給出 t 組數(shù)據(jù),每組數(shù)據(jù)給出一個(gè)整數(shù) n 代表有 n 個(gè)點(diǎn) n-1 條邊,然后依次給出 n-1 條邊及其權(quán)值(僅有 0、1),要統(tǒng)計(jì)每個(gè)點(diǎn)距離他最近的點(diǎn)的個(gè)數(shù)(包括其自身),最后將每個(gè)點(diǎn)距離他最近的個(gè)數(shù)異或后輸出
思路:由于要統(tǒng)計(jì)距離每個(gè)點(diǎn)最近的點(diǎn)的個(gè)數(shù),且邊的權(quán)值僅有 0、1,因此可以考慮當(dāng)邊權(quán)為 0 時(shí),使用并查集將點(diǎn)連接,邊權(quán)為 1 時(shí),不進(jìn)行任何操作,這樣將所有的點(diǎn)可劃分為多個(gè)連通塊,然后統(tǒng)計(jì)每個(gè)點(diǎn)所在的連通塊中的點(diǎn)的個(gè)數(shù)即可,最后將所有點(diǎn)的值異或輸出。
Source Program
#include<iostream> #include<cstdio> #include<cstdlib> #include<string> #include<cstring> #include<cmath> #include<ctime> #include<algorithm> #include<utility> #include<stack> #include<queue> #include<vector> #include<set> #include<map> #define PI acos(-1.0) #define E 1e-6 #define MOD 16007 #define INF 0x3f3f3f3f #define N 1000001 #define LL long long using namespace std; int father[N]; int num[N]; int Find(int x){while(father[x]!=x)x=father[x];return x; } void Union(int x,int y){x=Find(x);y=Find(y);if(x!=y)father[x]=y;num[y]+=num[x]; } int main(){int t;scanf("%d",&t);while(t--){int n;scanf("%d",&n);memset(num,0,sizeof(num));for(int i=1;i<=n;i++)father[i]=i;int m=n-1;for(int i=0;i<m;i++){int x,y,w;scanf("%d%d%d",&x,&y,&w);if(w==0)Union(x,y);}for(int i=1;i<=n;i++){//枚舉每個(gè)點(diǎn)father[i]=Find(i);//尋找每個(gè)點(diǎn)的父節(jié)點(diǎn)num[father[i]]++;//統(tǒng)計(jì)子節(jié)點(diǎn)個(gè)數(shù)(包括其自身)}for(int i=1;i<=n;i++)//統(tǒng)計(jì)父節(jié)點(diǎn)外的點(diǎn)的個(gè)數(shù)num[i]=num[father[i]];int res=0;for(int i=1;i<=n;i++)//將所有點(diǎn)的值異或res^=num[father[i]];printf("%d\n",res);}return 0; }?
總結(jié)
以上是生活随笔為你收集整理的Tree(HDU-5060)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【】
- 下一篇: 4-adjacent(AtCoder-2