这道题其实跟The XOR Largest Pair几乎一样,就是要先预处理出来每个结点到跟的异或距离,之后直接用上道题的代码就可以了…
但是在处理这个距离的时候用vector卡了时间…换成链式前向星就ok了
链式前向星板子留一下:
const int MaxN = 100010, MaxM = 500010;
struct edge
{
int to, dis, next;
};
edge e[MaxM];
int head[MaxN], dis[MaxN], cnt;
bool vis[MaxN];
int n, m, s;
inline void add_edge( int u, int v, int d )
{
e[cnt].dis = d;
e[cnt].to = v;
e[cnt].next = head[u];
head[u] = cnt++;
}
void init(){
cnt=0;
memset(head,-1,sizeof(head));
}
/*遍历的时候:
for(int i=head[x];i!=-1;i=e[i].next){
int y=e[i].to;
int w=e[i].dis;
blabla
}
*/
AC代码:
#include <cstdio>
#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
const int maxt=4*1e6;
const int maxn=2e5+10;
struct edge
{
int to, dis, next;
};
edge e[maxn];
int head[maxn], dis[maxn], cnt;
int n;
int vis[maxn];
int d[maxn];
int trie[maxt][2],tot;
void init()
{
memset(vis,0,sizeof(vis));
memset(trie,0,sizeof(trie));
tot=1;
cnt=0;
memset(head,-1,sizeof(head));
}
inline void add_edge( int u, int v, int d )
{
e[cnt].dis = d;
e[cnt].to = v;
e[cnt].next = head[u];
head[u] = cnt++;
}
void insert(int x)
{
int p=1;
for(int i=31;i>=0;i--){
int c=(x>>i)&1;
if(!trie[p][c]) trie[p][c]=++tot;
p=trie[p][c];
}
}
int search(int x)
{
int p=1,ans=0;
for(int i=31;i>=0;i--){
int c=(x>>i)&1;
if(trie[p][!c]) ans=ans|(1<<i),p=trie[p][!c];
else p=trie[p][c];
}
return ans;
}
void dfs(int x,int dis)
{
if(vis[x]) return;
d[x]=dis;
vis[x]=1;
for(int i=head[x];i!=-1;i=e[i].next){
int y=e[i].to;
int w=e[i].dis;
dfs(y,dis^w);
}
return;
}
int main()
{
while(scanf("%d",&n)!=EOF){
int start;init();
for(int i=0;i<n-1;i++){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
add_edge(u,v,w);
add_edge(v,u,w);
start=u;
}
dfs(start,0);
int ans=0;
for(int i=0;i<n;i++){
if(!vis[i]) continue;
int num=d[i];
insert(num);
ans=max(ans,search(num));
}
printf("%d\n",ans);
}
}