树哈希与换根dp:CF763D

文章介绍了使用树哈希函数在图中计算从节点x到节点y路径影响的示例,通过dfs遍历维护dp值,展示了如何在哈希过程中仅更新与目标节点相关的部分,以高效处理大规模数据。

采用的树哈希函数是:

dpx=wx×∑y∈xdpy2+wx2\Large dp_x=w_x\times \sum_{y\in x}dp_y^2+w_x^2dpx=wx×yxdpy2+wx2

发现从 xxxyyy 时只有 xxxyyy 的哈希值会变化,分别维护即可

#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)(1e9+123)
int n, m, i, j, k, T;
int pos, mx, cnt, h[N], w[N], dp[N], f[N], u, v; 
map<int, int>mp; 
vector<int>G[N]; 

int Mod(int a) {
	return (a%mo+mo)%mo; 
}

void add(int x, int k) {
	mp[x]+=k; 
	if(mp[x]==1 && k==1) ++cnt; 
	if(mp[x]==0 && k==-1) --cnt; 
//	printf("# %lld (%lld): %lld\n", x, mp[x], cnt); 
}

void dfs1(int x, int fa) {
//	int s1, s2=0; 
	w[x]=1; 
	for(int y : G[x]) {
		if(y==fa) continue; 
		dfs1(y, x); 
		w[x]+=w[y]; f[x]=Mod(f[x]+dp[y]*dp[y]); 
	}
	dp[x]=Mod(w[x]*f[x]%mo+w[x]*w[x]%mo); 
	add(dp[x], 1); 
//	printf("%lld : %lld\n", x, dp[x]); 
}

void dfs2(int x, int fa) {
	int xw, xf, xdp, yw, yf, ydp; 
	for(int y : G[x]) {
		if(y==fa) continue; 
//		printf("del [%lld] : %lld\n", x, dp[x]); 
		add(dp[x], -1); xdp=dp[x]; xw=w[x]; xf=f[x]; 
		w[x]=w[x]-w[y]; f[x]=Mod(f[x]-dp[y]*dp[y]); 
		dp[x]=(w[x]*f[x]%mo+w[x]*w[x]%mo); 
//		printf("ins [%lld] %lld : %lld\n", x, w[x], dp[x]); 
		add(dp[x], 1); 
		
//		printf("del [%lld] : %lld\n", y, dp[y]); 

		add(dp[y], -1); ydp=dp[y]; yw=w[y]; yf=f[y]; 
		w[y]=n; f[y]=Mod(f[y]+dp[x]*dp[x])%mo; 
		dp[y]=(w[y]*f[y]%mo+w[y]*w[y]%mo); 
		
//		printf("ins [%lld] : %lld\n", y, dp[y]); 
		add(dp[y], 1); 
		
//		printf("%lld : %lld\n", y, cnt); 
//		for(auto t=mp.begin(); t!=mp.end(); ++t) printf("%lld ", t); 
		if(cnt>mx) mx=cnt, pos=y; 
		
		dfs2(y, x); 
		
		add(dp[x], -1); add(dp[y], -1); 
		dp[x]=xdp; w[x]=xw; f[x]=xf; add(dp[x], 1); 
		dp[y]=ydp; w[y]=yw; f[y]=yf; add(dp[y], 1); 
	}
}

signed main()
{
//	freopen("in.txt", "r", stdin);
//	freopen("out.txt", "w", stdout);
//	T=read();
//	while(T--) {
//
//	}
	n=read(); 
	for(i=1, k=1; i<n; ++i) {
		u=read(); v=read(); 
		G[u].pb(v); G[v].pb(u); 
	} 
	dfs1(1, 0); 
	mx=cnt; pos=1; 
	dfs2(1, 0); 
	printf("%lld", pos); 
	return 0;
}


【SCI级别】多策略改进鲸鱼优化算法(HHWOA)和鲸鱼优化算法(WOA)在CEC2017测试集函数F1-F30寻优对比内容概要:本文档主要介绍了一项关于多策略改进鲸鱼优化算法(HHWOA)标准鲸鱼优化算法(WOA)在CEC2017测试集函数F1-F30上进行寻优性能对比的研究,属于智能优化算法领域的高水平科研工作。文中通过Matlab代码实现算法仿真,重点展示了HHWOA在收敛速度、寻优精度和稳定性方面的优势,体现了多策略改进的有效性。该研究适用于复杂优化问题求解,尤其在工程优化、参数辨识、机器学习超参数调优等领域具有应用潜力。; 适合人群:具备一定算法基础和Matlab编程能力的研究生、科研人员及从事智能优化算法开发应用的工程技术人员,尤其适合致力于SCI论文写作算法创新的研究者。; 使用场景及目标:①用于理解鲸鱼优化算法的基本原理及多策略改进思路(如种群初始化、非线性收敛因子、精英反向学习等);②为智能优化算法的性能测试对比实验提供CEC2017标准测试平台的实现参考;③支撑学术研究中的算法创新论文复现工作。; 阅读建议:建议结合提供的Matlab代码进行实践操作,重点关注HHWOA的改进策略模块WOA的差异,通过重复实验验证算法性能,并可将其思想迁移至其他优化算法的改进中,提升科研创新能力。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值