• POJ 3764


    题目链接:http://poj.org/problem?id=3764
    这题的题意是让你找一条路径,那条路径的点额权值异或得到的结果要最大。题目给出n-1条边,说明这个图是个联通图。我们可以用dfs求出从节点0开始到每一个点通过的路径上的异或值,用val[]来保存。然后利用字典树。把val[]的值一位一位的插入的01字典树中。然后再查找。找到最大值。

    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <queue>
    #include <set>
    #include <map>
    #include <string>
    #include <math.h>
    #include <stdlib.h>
    using namespace std;
    
    int val[200005];
    int v[22000000];
    int ch[22000000][2];
    int sz;
    struct Edge
    {
        int next;
        int to;
        int w;
    }edge[200050]; 
    int head[200050];
    int cnt;
    void init()
    {
        memset(head,-1,sizeof(head));
        cnt=0;
    } 
    void add(int u,int v,int w)
    {
        edge[cnt].w=w;
        edge[cnt].to=v;
        edge[cnt].next=head[u];
        head[u]=cnt++;
    }
    void insert(int x)
    {
        int u=0;
        for(int i=30;i>=0;i--)
        {
            int c;
            if(((1<<i)&x)==0)
            c=0;
            else
            c=1;
            if(!ch[u][c])
            {
                memset(ch[sz],0,sizeof(ch[sz]));
                ch[u][c]=sz++;
            }
            u=ch[u][c];
        }
        v[u]=x;
    }
    int find(int x)
    {
        int u=0;
        for(int i=30;i>=0;i--)
        {
            int c;
            if(((1<<i)&x)==0)
            c=1;
            else
            c=0;
            if(!ch[u][c])
            u=ch[u][1-c];
            else
            u=ch[u][c];
        }
        return v[u]^x;
    }
    void dfs(int u,int v,int p)
    {
        val[u]=v;
        for(int i=head[u];i!=-1;i=edge[i].next)
        {
            if(edge[i].to!=p)
            {
                dfs(edge[i].to,edge[i].w^v,u); 
            }
        } 
    }
    int main()
    {
        int n;
        while(scanf("%d",&n)!=EOF)
        {
            init();
            sz=1;
            memset(ch[0],0,sizeof(ch[0]));
            for(int i=0;i<n-1;i++)
            {
                int u,v,w;
                scanf("%d %d %d",&u,&v,&w);
                add(u,v,w);
                add(v,u,w);
            } 
            dfs(0,0,-1);
        //  for(int i=0;i<n;i++)
        //  printf("%d
    ",val[i]); 
            int ans=0;
            for(int i=0;i<n;i++)
            {
                insert(val[i]);
                ans=max(ans,find(val[i])); 
            }   
            printf("%d
    ",ans);
        }
    
    } 
  • 相关阅读:
    Ajax
    Guitar and Music Theory
    leetcode62 不同路径(Medium)
    leetcode49 字母异位词分组(Medium)
    leetcode3 无重复的最长子串(Medium)
    leetcode69 x的平方根(Easy)
    leetcode300 最长上升子序列(Medium)
    leetcode240 搜索二维矩阵II (Medium)
    leetcode34 在排序数组中查找元素的第一个和最后一个位置(Medium)
    leetcode31 下一个排列(Medium)
  • 原文地址:https://www.cnblogs.com/NaCl/p/9580115.html
Copyright © 2020-2023  润新知