小
Z
有一个树,树上的节点。有一个权值出。他现在在节点
S
上。小
Z
想知道,从
S
出发的任意路径中(不经过重复点的路径),经过的权值的
MEX
的最大值是多
少。
MEX
表示最小未出现的自然数,
例如,
在集合
{0,1,2,4,50}
中,
MEX = 3,
而
{1,2,3,
4,
5}
的
MEX = 0
。
第一行f整数
T,
表示数据组数。
对于每组数据:
■ 第一行一个整数n
s,
表示树的大小和小
z
所在的位置。
■ 第二行
n
个整数ai,表示树上节点的权值。
■ 接下来
n-1
行,每行两个整数如
0,
表示有一条连接"和
0
的边.
#include<bits/stdc++.h>
using namespace std;
class trees
{
public:
int nodenum=0;
struct nodes
{
public:
int next[10001],nextnum;
int var;
}node[10001];
void new_node(int var){
node[++nodenum].var=var;
}
void new_tiein(int node1,int node2){
node[node1].next[++node[node1].nextnum]=node2;
node[node2].next[++node[node2].nextnum]=node1;
}
};
set<int>C;
int mex=0;
trees tree[4];
void dfs(int k,int prex,int point){
C.erase(tree[k].node[point].var);
mex=max(mex,*C.begin());
for(int i=1;i<=tree[k].node[point].nextnum;++i){
if(tree[k].node[point].next[i]!=prex)dfs(k,point,tree[k].node[point].next[i]);
}
C.insert(tree[k].node[point].var);
}
int t,n,s,v,u;
int main(){
cin>>t;
for(int k=1;k<=t;++k){
for(int i=0;i<=100000;++i)C.insert(i);
cin>>n>>s;
for(int i=1;i<=n;++i){
cin>>v;
tree[k].new_node(v);
}
for(int i=1;i<n;++i){
cin>>u>>v;
tree[k].new_tiein(u,v);
}
dfs(k,0,s);
cout<<mex<<endl;
mex=0;
C.clear();
}
return 0;
}