• B1954 The xor-longest Path


    爆炸入口

    给定一颗带权值的,节点数为n的树,求树上路径最大异或和。

    solution: 先dfs将所有点到根的异或和算出来。然后放进tire树中贪心。

    #include<cstdio>
    #include<iostream>
    using namespace std;
    const int manx=100010;
    int n;
    struct node
    {
    	int point;
    	int nxt;
    	int val;
    };
    node line[manx<<1];
    int head[manx],tail;
    int dis[manx];
    int t[manx<<5][2],end;
    void add(int a,int b,int c)
    {
    	line[++tail].point=b;
    	line[tail].val=c;
    	line[tail].nxt=head[a];
    	head[a]=tail;
    }
    void dfs(int now,int f,int sum)
    {
    	dis[now]=sum;
    	for(int i=head[now];i;i=line[i].nxt)
    		if(f!=line[i].point)
    			dfs(line[i].point,now,sum^line[i].val);
    	return ;
    }
    void ins(int val)
    {
    	int now=0;
    	for(int i=(1<<30);i;i>>=1)
    	{
    		int nxt= (i&val) ? 1 : 0;
    		if(!t[now][nxt])	t[now][nxt]=++end;
    		now=t[now][nxt];
    	}
    	return ;
    }
    int find(int val)
    {
    	int res=0,now=0;
    	for(int i=(1<<30);i;i>>=1)
    	{
    		int nxt=(i&val) ? 0 : 1;
    		if(t[now][nxt])	now=t[now][nxt],res+=i;
    		else 			now=t[now][nxt^1];
    	}
    	return res;
    }
    int main()
    {
    	scanf("%d",&n);
    	int a,b,c;
    	for(int i=1;i<n;i++)
    	{
    		scanf("%d%d%d",&a,&b,&c);
    		add(a,b,c),add(b,a,c);
    	}
    	dfs(1,0,0);
    	for(int i=1;i<=n;i++)
    		ins(dis[i]);
    	int ans=0;
    	for(int i=1;i<=n;i++)
    		ans=max(ans,find(dis[i]));
    	printf("%d",ans);
    }
    
  • 相关阅读:
    Qt的.pro文件
    AI_八数码
    安装 MINGW GCC 4.4.0
    VC中应用Excel
    八数码问题_启发搜索
    【收集】【收藏】【转帖】game development resouce
    QT小记之在VS2005中使用QT
    [转文]VS2008 安装 Boost 1.43.0
    搬家到博客园了
    转 暴雪总裁总结游戏十条经验
  • 原文地址:https://www.cnblogs.com/Lance1ot/p/9226232.html
Copyright © 2020-2023  润新知