萌新oi入门求出线性基
查看原帖
萌新oi入门求出线性基
774854
qzmoot楼主2024/3/16 16:04
#include <bits/stdc++.h>
#define int long long
#define pb push_back
using namespace std;
const int N=50005;
int n,m,dfn[N],x[105],book[N],ans;
vector<int>a[N],l[N];
void add(int xx)
{
	for(int i=63;i>=0;i--)
		if((xx>>i)&1)
		{
			if(!x[i])
			{
				x[i]=xx;
				return;
			}
			xx^=x[i];
		}
}
void dfs(int u,int fa,int sum)
{
	dfn[u]=sum,book[u]=1;
	for(int i=0;i<a[u].size();i++)
	{
		if(a[u][i]==fa)continue;
		if(!book[a[u][i]])
			dfs(a[u][i],u,sum^l[u][i]);
		else
			add(sum^l[u][i]^dfn[a[u][i]]);
	}
}
signed main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
	{
		int u,v,w;
		scanf("%d%d%d",&u,&v,&w);
		a[u].pb(v),l[u].pb(w);
		a[v].pb(u),l[v].pb(w);
	}
	dfs(1,0,0);
	ans=dfn[n];
	for(int i=63;i>=0;i--)
		if(ans^x[i]>ans)
			ans^=x[i];
	printf("%lld",ans);
	return 0;
}
2024/3/16 16:04
加载中...