专栏文章

题解:AT_abc396_d [ABC396D] Minimum XOR Path

AT_abc396_d题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mipz2i35
此快照首次捕获于
2025/12/03 20:17
3 个月前
此快照最后确认于
2025/12/03 20:17
3 个月前
查看原文

题面

题目描述

给定一个简单的连通无向图,其中 NN 顶点编号为 11NNMM 边编号为 11MM。边 ii 连接顶点 uiu_iviv_i,并有一个标签 wiw_i
在从顶点 11 到顶点 NN 的所有简单路径(不多次经过同一顶点的路径)中,求出该路径上边的标号的最小异或。
对于非负整数 AABB,它们的异或 ABA \oplus B 定义如下:
  • ABA \oplus B 的二进制表示中,2k(k0)2^k \,(k \ge 0) 对应位置上的数字是 11,当且仅当 AABB 的同一位置上的数字之一恰好是 11;否则为 00
例如, 35=63 \oplus 5 = 6(二进制:011101=110011 \oplus 101 = 110)。
一般来说,kk 整数 p1,,pkp_1, \dots, p_k 的异或定义为 (((p1p2)p3)pk)(\cdots ((p_1 \oplus p_2) \oplus p_3) \oplus \cdots \oplus p_k)。可以证明它不依赖于 p1,,pkp_1, \dots, p_k 的阶数。

数据范围

  • 2N102 \leq N \leq 10
  • N1MN(N1)2N-1 \leq M \leq \frac{N(N-1)}{2}
  • 1ui<viN1 \leq u_i < v_i \leq N
  • 0wi<2600 \leq w_i < 2^{60}
  • 给定图是一个简单连通无向图。
  • 所有输入值均为整数。

思路

首先我们注意到 N10N \leq 10,所以我们可以直接通过 DFS 跑所有的情况。
注意:数据范围比较大所以需要开 long long

Code

CPP
#include <bits/stdc++.h>
using namespace std;
const int N=1e6+5;
#define int long long
vector<pair<int,int>> g[N];
int n,m,vis[N],ans=9e18;
void dfs(int u,int c){
	if(u==n){
		ans=min(ans,c);
	}
	for(auto [v,w]:g[u]){
		if(vis[v]){
			continue;
		}
		vis[v]=1;
		dfs(v,c^w);
		vis[v]=0;
	}
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int u,v,w;
		cin>>u>>v>>w;
		g[u].push_back({v,w});//记录路径 
		g[v].push_back({u,w});
	}
	vis[1]=1;
	dfs(1,0);
	cout<<ans;
	return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...