zoukankan      html  css  js  c++  java
  • bzoj 2115: [Wc2011] Xor【线性基+dfs】

    …老是想到最长路上
    其实可以这样:把每个环的xor和都存起来,然后任选一条1到n的路径的xor和ans,答案就是这个ans在环的线性基上跑贪心。
    为什么是对的……因为可以重边而且是无相连通的,并且对于一条路,走偶数次相当于没走,所以任意走一条主路都可以从歧路走到某个环上,然后从歧路返回,此时就得到了这个环的xor和并且没有xor上歧路的边权。

    #include<iostream>
    #include<cstdio>
    using namespace std;
    const int N=1000005;
    int n,m,h[N],cnt,tot;
    long long dis[N],c[N],b[N],ans;
    bool v[N];
    struct qwe
    {
    	int ne,to;
    	long long va;
    }e[N<<1];
    long long read()
    {
    	long long r=0,f=1;
    	char p=getchar();
    	while(p>'9'||p<'0')
    	{
    		if(p=='-')
    			f=-1;
    		p=getchar();
    	}
    	while(p>='0'&&p<='9')
    	{
    		r=r*10+p-48;
    		p=getchar();
    	}
    	return r*f;
    }
    void add(int u,int v,long long w)
    {
    	cnt++;
    	e[cnt].ne=h[u];
    	e[cnt].to=v;
    	e[cnt].va=w;
    	h[u]=cnt;
    }
    void dfs(int u)
    {
    	v[u]=1;
    	for(int i=h[u];i;i=e[i].ne)
    	{
    		if(v[e[i].to])
    			c[++tot]=dis[u]^dis[e[i].to]^e[i].va;
    		else
    		{
    			dis[e[i].to]=dis[u]^e[i].va;
    			dfs(e[i].to);
    		}
    	}
    }
    void charu(long long x)
    {
    	for(int i=62;i>=0;i--)
    		if(x>>i)
    		{
    			if(!b[i])
    			{
    				b[i]=x;
    				return;
    			}
    			x^=b[i];
    		}
    }
    int main()
    {
    	n=read(),m=read();
    	for(int i=1;i<=m;i++)
    	{
    		long long x=read(),y=read(),z=read();
    		add(x,y,z);
    		add(y,x,z);
    	}
    	dfs(1);
    	ans=dis[n];
    	for(int i=1;i<=tot;i++)
    		charu(c[i]);
    	for(int i=62;i>=0;i--)
    		if((ans^b[i])>ans)
    			ans=ans^b[i];
    	printf("%lld
    ",ans);
    	return 0;
    }
    
  • 相关阅读:
    BZOJ5212 ZJOI2018历史(LCT)
    BZOJ5127 数据校验
    253. Meeting Rooms II
    311. Sparse Matrix Multiplication
    254. Factor Combinations
    250. Count Univalue Subtrees
    259. 3Sum Smaller
    156. Binary Tree Upside Down
    360. Sort Transformed Array
    348. Design Tic-Tac-Toe
  • 原文地址:https://www.cnblogs.com/lokiii/p/8551591.html
Copyright © 2011-2022 走看看