图论+线性基高斯消元与主元:1019T2 / P4151

这篇具有很好参考价值的文章主要介绍了图论+线性基高斯消元与主元:1019T2 / P4151。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

http://cplusoj.com/d/senior/p/SS231019B

相当于图上选一条链和一堆环


考虑dfs生成树。

则链是两条从根出发的链

环是每条返祖边组成的环

所以环和链的异或和可以求出来


链的放到线性基里

然后线性基通过高斯消元求主元(贪心思想,主元可以令那一位一定为1。那么就钦定主元为必选,这样一定更优)

高消的过程中也需要对链进行消元

最后用链来查询,丢01trie上维护文章来源地址https://www.toymoban.com/news/detail-718838.html

#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int read(){int x=0,f=1;char ch=getchar(); while(ch<'0'||
ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){
x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*f;}
#define Z(x) (x)*(x)
#define pb push_back
//mt19937 rand(time(0));
//mt19937_64 rand(time(0));
//srand(time(0));
#define N 100010
//#define M
//#define mo
int n, m, i, j, k, T;
int ans, C, MY, dis[N]; 
struct line_kun {
	int p[100]; 
	void push(int k) {
//		printf("Add %lld\n", k); 
		for(int j = 62; j >= 0; --j)
			if((k>>j)&1) {
				if(!p[j]) { p[j]=k; break; }
				k^=p[j];  
			}
	}
	void xiaoyuan() {
//		for(int j = 62; j >= 0; --j) printf("%lld ", p[j]); printf("\n"); 
		for(int j = 62; j >= 0; --j)
			if(p[j]) {
				for(int i = 62; i > j; --i) 
					if((p[i]>>j)&1) p[i]^=p[j]; 
				for(int i = 1; i <= n; ++i) 
					if((dis[i]>>j)&1) dis[i]^=p[j]; 
			}
//		for(int j = 62; j >= 0; --j) printf("%lld ", p[j]); printf("\n"); 
	}
	pair<int, int> main_Y() {
		int k = (1ll<<62)-1, ans = 0; 
		for(int j = 62; j >= 0; --j) 
			if(p[j]) k-=(1ll<<j), ans^=p[j]; 
		return {k, ans}; 
	}
}J; 
struct Trie_tree {
	int tot = 1, son[N * 60][2] ; 
	int que_max(int x) {
//		printf("Que_mx : %lld\n", x); 
		int u = 1, i, k, ans=0; 
		for(i = 62; i>=0; --i) {
			k = (x>>i)&1ll; 
			if(son[u][k^1]) u=son[u][k^1], ans|=((k^1)<<i); 
			else u=son[u][k], ans|=(k<<i); 
		}
//		printf("\t We get %lld\n", ans); 
		return ans; 
	}
	void add(int x) {
		int u = 1, i, k; 
		for(i = 62; i >= 0; --i) {
			k = (x>>i)&1ll; 
			if(!son[u][k]) son[u][k] = ++tot; 
			u = son[u][k]; 
		}
	}
}Trie;
struct node {
	int y, z; 
};
int u, v, w; 
pair<int, int>p; 
vector<node>G[N]; 

void dfs(int x, int fa) {
	for(auto t : G[x]) {
		int y = t.y, z = t.z; 
//		if(t.y == fa) continue; 
		if(dis[y] == -1) {
			dis[y] = dis[x] ^ z; 
			dfs(y, x); 
		}
		else J.push(dis[x] ^ dis[y] ^ z); 
	}
}

signed main()
{
//	freopen("in.txt", "r", stdin);
//	freopen("out.txt", "w", stdout);
//	freopen("path.in", "r", stdin);
//	freopen("path.out", "w", stdout);
	T=read();
//	while(T--) {
//
//	}
	n = read(); m = read(); 
	for(i=1; i<=m; ++i) {
		u = read(); v = read(); w = read(); 
		G[u].pb({v, w}); G[v].pb({u, w}); 
	}
	memset(dis, -1, sizeof(dis)); 
	dis[1]=0; dfs(1, 0); 
//	for(i=1; i<=n; ++i) printf("%lld ", dis[i]); printf("\n"); 
	J.xiaoyuan(); 
	p = J.main_Y(); MY = p.first; C = p.second; 
//	cout<<(bitset<100>)(MY)<<endl; 
//	for(i=1; i<=n; ++i) dis[i]&=MY; 
//	printf("# %lld %lld %lld\n", MY, C, k); 
	k=C-(MY&C); C&=MY; 
//	printf("# %lld %lld %lld\n", MY, C, k); 
//	for(i=1; i<=n; ++i) printf("%lld ", dis[i]); printf("\n"); 
	Trie.add(0); 
	for(i=1; i<=n; ++i) {
		if(i==1) Trie.add(dis[i]); 
		if(i==n)  ans = max(ans, dis[i]^Trie.que_max(dis[i]^C)^C); 
	}
	printf("%lld", ans^k); 
	return 0;
}


到了这里,关于图论+线性基高斯消元与主元:1019T2 / P4151的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Matlab中求解线性方程组——高斯消元法、LU分解法、QR分解法、SVD分解法、迭代法等

    MATLAB迭代的三种方式以及相关案例举例 MATLAB矩阵的分解函数与案例举例 MATLAB当中线性方程组、不定方程组、奇异方程组、超定方程组的介绍 MATLAB语句实现方阵性质的验证 MATLAB绘图函数的相关介绍——海底测量、二维与三维图形绘制 MATLAB求函数极限的简单介绍 文章目录 前言

    2024年02月08日
    浏览(46)
  • 列主高斯消元法

    看过我前几个博文的小伙伴们,细心的小伙伴会发现我前面讲过一个 高斯消元法 ,那么和接下来讲的列主高斯消去法有什么区别呢?? 目录 一、前言 二、列主高斯消元法 1.数学计算过程 三、代码实现过程 1、源代码展示(这次没有采用高斯消元法中校园的时候,进阶的列

    2024年01月22日
    浏览(39)
  • 高斯消元法(matlab)

    目录 高斯部分主元消元法 高斯列主元消元法  高斯部分主元消去法: 原理:将线性方程组的系数即为矩阵A(n,n),对应的值即为 B(n,1),记增广矩阵C为(A,B); 第一步:找出系数中绝对值最大的元素,将其交换到C(1,1),通过线性运算,使得第一列C(1,1)下面的元素都消为0; 第二步

    2024年02月06日
    浏览(32)
  • C语言用高斯消元法求行列式

    目录 数学原理 选择主元 程序设计 整体流程与代码 测试函数 测试结果 高斯消元法求行列式:利用初等行变换,化为上三角行列式,求其主对角线的乘积 行列式的初等行变换: 1)换行变换:交换两行(行列式需变号) 2)倍法变换:将行列式的某一行(列)的所有元素同乘

    2024年02月08日
    浏览(30)
  • [数论第三节]高斯消元法/求组合数/卡特兰数

    求解含有n个未知数,n个方程的多元线性方程组 O(n^3) 初等行变换: 某行乘以一个非零数 交换两行 某行加上另一行的若干倍 利用初等行变换将方程组化为上三角矩阵 解的情况: 完美阶梯型:唯一解 非完美阶梯型: 0 == 非0:无解 0 == 0:无穷解 步骤: 枚举每一列 找到这一列

    2024年02月13日
    浏览(28)
  • 算法基础学习笔记——⑬高斯消元\组合计数\容斥原理

    ✨ 博主: 命运之光 ✨ 专栏: 算法基础学习 目录 ✨高斯消元 ✨组合计数 🍓通过预处理逆元的方式求组合数: 🍓Lucas定理: 🍓分解质因数法求组合数: 前言: 算法学习笔记记录日常分享,需要的看哈O(∩_∩)O,感谢大家的支持! 高斯消元(Gaussian Elimination)是一种用于解线

    2024年02月07日
    浏览(28)
  • 线性代数笔记2--矩阵消元

    0. 简介 矩阵消元 1. 消元过程 实例方程组 { x + 2 y + z = 2 3 x + 8 y + z = 12 4 y + z = 2 begin{cases} x+2y+z=2\\\\ 3x+8y+z=12\\\\ 4y+z=2 end{cases} ⎩ ⎨ ⎧ ​ x + 2 y + z = 2 3 x + 8 y + z = 12 4 y + z = 2 ​ 矩阵化 A = [ 1 2 1 3 8 1 0 4 1 ] X = [ x y z ] A= begin{bmatrix} 1 2 1 \\\\ 3 8 1 \\\\ 0 4 1 end{bmatrix} \\\\ X= begin{bmatrix} x\\\\

    2024年02月22日
    浏览(34)
  • 线性代数 --- LU分解(Gauss消元法的矩阵表示)

                     首先, LU分解实际上就是用矩阵的形式来记录的高斯消元的过程 。其中,对矩阵A进行高斯消元后的结果为矩阵U,是LU分解后的两个三角矩阵中其中之一。U是一个上三角矩阵,U就是上三角矩阵upper triangle的首字母的大写。         高斯消元的每一步都

    2024年02月02日
    浏览(42)
  • 高斯误差线性单元激活ReLU以外的神经网络

    高斯误差线性单位(GELU)激活函数由加州大学伯克利分校的Dan Hendrycks和芝加哥丰田技术研究所的Kevin Gimpel于2018年引入。激活函数是触发神经元输出的“开关”,随着网络的深入,其重要性也随之增加。最近几周,机器学习社区中的一些讨论使GELU重新成为人们关注的焦点。

    2024年02月16日
    浏览(24)
  • 高斯消去法解线性方程组的fortran程序实现

    高斯消去法解方程组的fortran程序实现 许多实际问题的解决,常常要化为求解线性代数方程组;例如,用最小二乘法处理测量结果和用差分法求解偏微分方程时,都会得到线性方程组;同时,很多物理学的问题最后也要归结到求矩阵的特征值和特征向量。因此,线性代数代数

    2024年02月07日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包