8 条题解

  • 2
    @ 2023-5-20 18:30:12

    路径最大异或和

    #include<bits/stdc++.h>
    #define int long long
    #define enel "\n"
    #define MOD 1000000007
    using namespace std;
    const int MAXN=50000;
    const int MAXL=60;
    struct NOTE
    {
    	signed v;
    	int s;
    };
    vector<NOTE> e[MAXN+5];
    int tot[MAXN+5];
    int a[MAXL+5];
    int n,m,ans;
    bool book[MAXN+6];
    void insert(int num)
    {
    	for(int j=60;j>=0;j--)
    	{
    		if(!num)
    			return;
    		if(!(num&(1ll<<j)))
    			continue;
    		if(a[j]!=0)
    		{
    			num=num^a[j];
    			continue;
    		}
    		for(int k=0;k<j;k++)
    			if(num&(1ll<<k))
    				num=num^a[k];
    		for(int k=j+1;k<=60;k++)
    			if(a[k]&(1ll<<j))
    				a[k]=a[k]^num;
    		a[j]=num;
    		break;
    	}
    	return;
    }
    void dfs(int now,int sum)
    {
    	book[now]=true;
    	tot[now]=sum;
    	for(int i=0;i<e[now].size();i++)
    	{
    		signed v=e[now][i].v;
    		int w=e[now][i].s;
    		if(book[v])
    		{
    			insert(sum ^ w ^ tot[v]);
    			continue;
    		}
    		dfs(v,sum^w);
    	}
    	return;
    }
    signed main()
    {
    	ios::sync_with_stdio(false);
    	cin.tie(0);
    	cin>>n>>m;
    	for(int i=1;i<=m;i++)
    	{
    		int u,v,x;
    		cin>>u>>v>>x;
    		e[u].push_back((NOTE){v,x});
    		e[v].push_back((NOTE){u,x});
    	}
    	dfs(1,0);
    	ans=tot[n];
    	for(int i=0;i<=MAXL;i++)
    		ans=max(ans,ans^a[i]);
    	cout<<ans<<endl;
    	return 0;
    }
    

    信息

    ID
    1277
    时间
    1000ms
    内存
    256MiB
    难度
    6
    标签
    递交数
    15
    已通过
    13
    上传者