专栏文章
题解: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 个月前
题面
题目描述
给定一个简单的连通无向图,其中 顶点编号为 到 , 边编号为 到 。边 连接顶点 和 ,并有一个标签 。
在从顶点 到顶点 的所有简单路径(不多次经过同一顶点的路径)中,求出该路径上边的标号的最小异或。
对于非负整数 和 ,它们的异或 定义如下:
- 在 的二进制表示中, 对应位置上的数字是 ,当且仅当 和 的同一位置上的数字之一恰好是 ;否则为 。
例如, (二进制:)。
一般来说, 整数 的异或定义为 。可以证明它不依赖于 的阶数。
数据范围
-
-
-
-
-
给定图是一个简单连通无向图。
-
所有输入值均为整数。
思路
首先我们注意到 ,所以我们可以直接通过 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 条评论,欢迎与作者交流。
正在加载评论...