首页 > 其他分享 >[CF845G] Shortest Path Problem? 题解

[CF845G] Shortest Path Problem? 题解

时间:2024-03-21 18:46:50浏览次数:15  
标签:now ba val int 题解 Path Problem include

[CF845G] Shortest Path Problem? 题解

注意到如果我们在路径中多走了一个环,那么得到的贡献就是这个环的贡献。

对于这种有关环的问题,考虑一棵生成树,这样所有环都可以用一条祖先边和一些树边组成,发现选环走的过程是独立的,考虑把所有环的权值丢进线性基里,然后查询 xordist[1] ^ xordist[n] 异或线性基子集的最小值。

时间复杂度:\(O((n + m)\log V)\)。

// Contest: Luogu
// Author: Moyou
// Copyright (c) 2023 Moyou All rights reserved.
// Date: 2023-12-07 00:39:45

#include <algorithm>
#include <cstring>
#include <iostream>
#include <queue>
using namespace std;
typedef pair<int, int> PII;
const int N = 2e5 + 10, B = 32;

int n, m, val[N];
vector<PII> g[N];
int ba[B];
void insert(int x) {
    for(int i = B - 1; ~i; i --)
        if(x >> i & 1) {
            if(!ba[i]) return void(ba[i] = x);
            x ^= ba[i];
        }
}
void dfs(int u, int now) {
    val[u] = now;
    for(auto [v, w] : g[u]) {
        if(val[v] == -1) dfs(v, now ^ w);
        else insert(now ^ w ^ val[v]);
    }
}
int Qmin(int x) {
    for(int i = B - 1; ~i; i --) 
        if(ba[i] && (x >> i & 1))
            x ^= ba[i];
    return x;
}
signed main() {
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    cin >> n >> m;
    for(int i = 1, a, b, c; i <= m; i ++) {
        cin >> a >> b >> c;
        g[a].push_back({b, c}), g[b].push_back({a, c});
    }
    memset(val, -1, sizeof val);
    dfs(1, 0);
    cout << Qmin(val[n]) << '\n';

    return 0;
}

标签:now,ba,val,int,题解,Path,Problem,include
From: https://www.cnblogs.com/MoyouSayuki/p/18088015

相关文章

  • 20240321每日一题题解
    20240321每日一题题解Problem已知\(f(x,n)=\sqrt{n+\sqrt{(n-1)+\sqrt{(n-2)+\sqrt{...+2+\sqrt{1+x}}}}}\)。计算\(f\)的值。输入\(x\)和\(n\)​。输出这个函数值,并且注意需要保留两位小数。例如,输入4.210,则应该输出3.68Solution递归?循环?说实话这道题是有一定思考......
  • P1017 [NOIP2000 提高组] 进制转换题解
    题目我们可以用这样的方式来表示一个十进制数:将每个阿拉伯数字乘以一个以该数字所处位置为指数,以10为底数的幂之和的形式。例如123可表示为1×102+2×101+3×100这样的形式。与之相似的,对二进制数来说,也可表示成每个二进制数码乘以一个以该数字所处位置为指数,以2为底数的幂之......
  • CF1945E Binary Search 题解
    CF1945EBinarySearch题目大意给定一个\(1\simn\)的排列\(A\)(不保证有序),对这个排列用如下代码片段二分,查找\(m\)的位置。intl=1,r=n+1;while(r-l>1){intmid=(l+r)/2;if(A[mid]<=m) l=mid;else r=mid;}cout<<l;显然不一定能查找到正确位置,所以在......
  • 题解 P5809【【模板】多项式复合逆】
    \(\text{Link}\)力求把最新技术翻译地人人都能看懂。推荐先学习:拉格朗日反演。题意给出\(n\)次多项式\(F(x)\),求一个\(n\)次多项式\(G(x)\)满足\(F(G(x))\equivx(\bmodx^{n+1})\)。保证\([x^0]F(x)=0\)且\([x^1]F(x)\ne0\)。\(n\le2\times10^4\)。思路我们......
  • 20240320每日一题题解
    20240320每日一题题解Problem阿克曼(Ackermann)函数\(A(m,n)\)中,\(m,n\)定义域是非负整数(\(m\le3\),\(n\le10\)),函数值定义为:\(\mathit{akm}(m,n)=n+1\);(\(m=0\)时)。\(\mathit{akm}(m,n)=\mathit{akm}(m-1,1)\);(\(m>0\)、\(n=0\)时)。\(\mathit{akm}(m,n)=......
  • CF817F MEX Queries 题解
    题目链接:CF或者洛谷不是很难的题,但在这里提供一个动态开点线段树怎么卡空间卡过去的极致空间处理技巧全局\(mex\)问题,常见的做法就是维护权值树,然后找第一个没有权值的点,可以维护\(\min\),但本题存在第三个操作,所以不能再去传统地维护\(\min或者\max\)去辅助二分了。观......
  • [ARC174B] Bought Review 题解
    【题目描述】你开了一家店,有\(A_i\)个\(i\)星级评论,你可以花费\(P_i\)元买到一个\(i\)星评论,问使得这家店评论的星星平均值不小于\(3\),最少要花多少钱。\(1\lei\le5\)。【思路】首先读入,判断平均值是否小于\(3\),如果大于等于,直接输出\(0\)​然后根据\(3\t......
  • luogu6801题解
    本题解中不区别长度和宽度的区别,它们在本题解中指的是同一个东西。本题解做法用到单调栈。看这个特殊性质好像是让我们在高度上进行研究一下。子任务\(4\)的特殊性质是想让你搞明白在一个矩形中如何计算其内部的矩形个数。下面是一个\(4\times5\)大小的矩形。先来不考......
  • CF1091F 题解
    blog。提供线性做法,各方面完爆反悔贪心。先钦定能不飞就不飞,最后再分配盈余的能量。可能会在飞Lava的时候不够能量,只需要在前面来回移动,刷能量即可。由于Swim比Walk快,所以能Swim就全部用Swim刷能量,不能就Walk。最后是分配盈余能量。显然优先把Walk换成Fly,换一......
  • Go环境变量配置,及GOROOT、GOPATH的区别
    一、安装Gogo下载地址:https://golang.google.cn/dl/windows下载安装,有两种方式。解压和直接安装方式一:直接下载安装包。以.msi结尾的文件。例如:go1.22.1.windows-amd64.msi 下载后,双击后一直点下一步即可安装成功。方式二:下载压缩包文件,直接解压。解压后配置环境变量......