hdu 5606 tree(집합)
tree
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 1183 Accepted Submission(s): 527
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
in the sample.
$ans_1=2$
$ans_2=2$
$ans_3=1$
$2~xor~2~xor~1=1$,so you need to output 1.
Source
BestCoder Round #68 (div.2)
제목 의 대의:
한 개의 나무(n 개의 점,n-1 개의 변 의 연결 도)가 있 고 한 개의 나무(n 개의 점,n-1 개의 변 의 연결 도)가 있 습 니 다.표 시 는 1~n 이 고 나무의 변 권 은 0 또는 1 입 니 다.각 점 에서 가장 가 까 운 점 개수(자신 포함)를 구하 십시오.
문제 풀이 사고:처음에 w 를 0 으로 판단 하면 된다 고 생각 했 어 요.w 가 0 일 때 연 결 된 이 두 가지 점 에 모두 1 처 리 를 해 주 고 마지막 에 그 자체 의 이 점 을 더 하면 답 이에 요!!근 데 이 건 틀 렸 어!!wrong answer!!!
다음 설명:예 를 들 어:
1
4
1 2 0
2 3 0
140 이 데이터 라면 어떻게 처리 해 야 하나 요?위 와 같이 계산 하면 1 이라는 점 에 대해 서 는 가장 가 까 운 점 이 두 개 밖 에 없 지만 실제로는 세 개!!따라서 상기 방법 을 사용 할 수 없 기 때문에 집합 하 는 방법 을 사용 하고 w=0 만 있 으 면 연결 된다.개 수 를 계산 하면 된다.
코드 참조.
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int num[100010];
int fa[100010];
int Find(int x)
{
if (x!=fa[x])
{
return fa[x]=Find(fa[x]);
}
return x;
}
void Unit(int x,int y)
{
x=Find(x);
y=Find(y);
if (x!=y)
{
fa[x]=y;
num[y]+=num[x];// ,
}
}
int main()
{
int t;
scanf("%d",&t);
while (t--)
{
int n;
scanf("%d",&n);
for (int i=1; i<=n; i++)
fa[i]=i,num[i]=1;
int u,v,w;
int s=0;
for (int i=1; i<=n-1; i++)
{
scanf("%d%d%d",&u,&v,&w);
if (w==0)
{
Unit(u,v);
}
}
for (int i=1; i<=n; i++)
{
if (fa[i]==i&&num[i]%2==1)
s=num[i]^s;
}
printf ("%d
",s);
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.