luogu P4103 [HEOI2014]大工程 虚树 + 树形 DP

本文探讨了在一个大型交通网络中构建新通道的算法问题,网络以单位边权树的形式存在,通过构建虚拟树和使用LCA算法,解决了在选定城市间新建通道的成本评估,包括总成本、最小和最大成本路径的计算。

Description

国家有一个大工程,要给一个非常大的交通网络里建一些新的通道。 
我们这个国家位置非常特殊,可以看成是一个单位边权的树,城市位于顶点上。 
在 2 个国家 a,b 之间建一条新通道需要的代价为树上 a,b 的最短路径。
 现在国家有很多个计划,每个计划都是这样,我们选中了 k 个点,然后在它们两两之间 新建 C(k,2)条 新通道。
现在对于每个计划,我们想知道:
 1.这些新通道的代价和
 2.这些新通道中代价最小的是多少 
3.这些新通道中代价最大的是多少

Input

第一行 n 表示点数。

 接下来 n-1 行,每行两个数 a,b 表示 a 和 b 之间有一条边。
点从 1 开始标号。 接下来一行 q 表示计划数。
对每个计划有 2 行,第一行 k 表示这个计划选中了几个点。
 第二行用空格隔开的 k 个互不相同的数表示选了哪 k 个点。

Output

输出 q 行,每行三个数分别表示代价和,最小代价,最大代价。

 题解:建出来虚树后就不是很难了

#include<bits/stdc++.h>
#define setIO(s) freopen(s".in","r",stdin), freopen(s".out","w",stdout)  
#define maxn 2000001 
#define inf 1000000000
#define ll long long   
using namespace std;          
vector<int>G[maxn];    
int edges,tim,root,top;                
int hd[maxn], to[maxn<<1], val[maxn<<1], nex[maxn<<1];  
int dep[maxn],Top[maxn],hson[maxn],siz[maxn],dfn[maxn],fa[maxn],arr[maxn],S[maxn],mk[maxn];   
inline void add(int u,int v)
{
	nex[++edges]=hd[u],hd[u]=edges,to[edges]=v,val[edges]=1; 
}  
void dfs1(int u,int ff)
{
	fa[u]=ff,siz[u]=1,dep[u]=dep[ff]+1,dfn[u]=++tim; 
	for(int i=hd[u];i;i=nex[i])
	{ 
		int v=to[i];
		if(v==ff) continue; 
		dfs1(v,u); 
		siz[u]+=siz[v]; 
		if(siz[v]>siz[hson[u]]) hson[u]=v; 
	} 
}
void dfs2(int u,int tp)
{
	Top[u]=tp; 
	if(hson[u]) dfs2(hson[u],tp); 
	for(int i=hd[u];i;i=nex[i])
	{
		int v=to[i];
		if(v==fa[u]||v==hson[u]) continue; 
		dfs2(v,v); 
	}
}
inline int LCA(int x,int y)
{
	while(Top[x]!=Top[y]) 
	{ 
		dep[Top[x]] > dep[Top[y]] ? x = fa[Top[x]] : y = fa[Top[y]]; 
	}
	return dep[x] < dep[y] ? x : y;  
}
inline int getdis(int x,int y)
{
	return dep[x] + dep[y] - (dep[LCA(x,y)] << 1); 
}
inline void addvir(int u,int v)
{ 
	G[u].push_back(v); 
}
void insert(int x)
{
	if(top<=1) { S[++top]=x; return;  }
	int lca=LCA(x, S[top]); 
	if(lca == S[top]) { S[++top] = x; return; }
	while(top > 1 && dep[S[top - 1]] >= dep[lca]) addvir(S[top - 1], S[top]), --top; 
	if(lca != S[top]) addvir(lca, S[top]), S[top] = lca;      
	S[++top] = x;   
}             
bool cmp(int i,int j)
{
	return dfn[i] < dfn[j]; 
}     
ll ans=0,a1,a2; 
int size[maxn],d1[maxn],d2[maxn],dmin1[maxn],k,dmin2[maxn];  
void DP(int x) 
{     
	size[x]=mk[x];      
	d1[x]=d2[x]=0;  
	if(!mk[x]) d1[x]=d2[x]=-inf; 
	dmin1[x]=dmin2[x]=inf; 
	if(mk[x]) dmin1[x]=0;     
	for(int i=0;i<G[x].size();++i)
	{
		int v = G[x][i],w = dep[G[x][i]] - dep[x]; 
		DP(v);     
		if(mk[v]) 
		{
			if(w <= dmin1[x]) dmin2[x]=dmin1[x], dmin1[x]=w; 
			else if(w < dmin2[x]) dmin2[x]=w; 
		}
		else 
		{
			if(w + dmin1[v] <= dmin1[x]) dmin2[x]=dmin1[x], dmin1[x]=w + dmin1[v]; 
			else if(w + dmin1[v] < dmin2[x]) dmin2[x] = w + dmin1[v];  
		}
		int curd=w+d1[v]; 
		if(curd >= d1[x])
		{
			d2[x]=d1[x], d1[x]=curd; 
		}
		else if(curd > d2[x])
		{
			d2[x] = curd;     
		}
		ans+=1ll*size[v]*w*(k-size[v]),size[x]+=size[v];        
	}   
	a1=max(a1, 1ll*(d1[x] + d2[x]));   
	a2=min(a2, 1ll*(dmin1[x] + dmin2[x])); 
}     
void init(int x)
{
	d1[x]=d2[x]=0; 
	dmin1[x]=dmin2[x]=inf; 
	for(int i=0;i<G[x].size();++i) init(G[x][i]); 
	G[x].clear();   
} 
inline void work() 
{ 
	scanf("%d",&k);  
	for(int i=1;i<=k;++i) scanf("%d",&arr[i]);    
	for(int i=1;i<=k;++i) mk[arr[i]] = 1; 
	sort(arr+1,arr+1+k,cmp);     
    top=S[0]=root=ans=0;          
    if(arr[1]!=1) S[top=1]=1;   
    for(int i=1;i<=k;++i)   insert(arr[i]);          
    while(top > 1) addvir(S[top-1], S[top]),--top; 
    a1=-inf, a2=inf, DP(1); 
    printf("%lld %lld %lld\n",ans,a2,a1);   
    init(1); 
    for(int i=1;i<=k;++i) mk[arr[i]]=0;                                        
}        
int main()
{
	// setIO("input");    
	int n; 
	scanf("%d",&n); 
	for(int i=1;i<n;++i) 
	{
		int a,b; 
		scanf("%d%d",&a,&b); 
		add(a,b), add(b,a); 
	}  
	dfs1(1,0),dfs2(1,1);  
	int Q; 
	scanf("%d",&Q);   
	for(int i=1;i<=Q;++i) work(); 
	return 0; 
}

【电力系统】单机无穷电力系统短路故障暂态稳定Simulink仿真(带说明文档)内容概要:本文档围绕“单机无穷电力系统短路故障暂态稳定Simulink仿真”展开,提供了完整的仿真模型与说明文档,重点研究电力系统在发生短路故障后的暂态稳定性问题。通过Simulink搭建单机无穷系统模型,模拟不同类型的短路故障(如三相短路),分析系统在故障期间及切除后的动态响应,包括发电机转子角度、转速、电压和功率等关键参数的变化,进而评估系统的暂态稳定能力。该仿真有助于理解电力系统稳定性机理,掌握暂态过程分析方法。; 适合人群:电气工程及相关专业的本科生、研究生,以及从事电力系统分析、运行与控制工作的科研人员和工程师。; 使用场景及目标:①学习电力系统暂态稳定的基本概念与分析方法;②掌握利用Simulink进行电力系统建模与仿真的技能;③研究短路故障对系统稳定性的影响及提高稳定性的措施(如故障清除时间优化);④辅助课程设计、毕业设计或科研项目中的系统仿真验证。; 阅读建议:建议结合电力系统稳定性理论知识进行学习,先理解仿真模型各模块的功能与参数设置,再运行仿真并仔细分析输出结果,尝试改变故障类型或系统参数以观察其对稳定性的影响,从而深化对暂态稳定问题的理解。
本研究聚焦于运用MATLAB平台,将支持向量机(SVM)应用于数据预测任务,并引入粒子群优化(PSO)算法对模型的关键参数进行自动调优。该研究属于机器学习领域的典型实践,其核心在于利用SVM构建分类模型,同时借助PSO的全局搜索能力,高效确定SVM的最优超参数配置,从而显著增强模型的整体预测效能。 支持向量机作为一种经典的监督学习方法,其基本原理是通过在高维特征空间中构造一个具有最间隔的决策边界,以实现对样本数据的分类或回归分析。该算法擅长处理小规模样本集、非线性关系以及高维度特征识别问题,其有效性源于通过核函数将原始数据映射至更高维的空间,使得原本复杂的分类问题变得线性可分。 粒子群优化算法是一种模拟鸟群社会行为的群体智能优化技术。在该算法框架下,每个潜在解被视作一个“粒子”,粒子群在解空间中协同搜索,通过不断迭代更新自身速度与位置,并参考个体历史最优解和群体全局最优解的信息,逐步逼近问题的最优解。在本应用中,PSO被专门用于搜寻SVM中影响模型性能的两个关键参数——正则化参数C与核函数参数γ的最优组合。 项目所提供的实现代码涵盖了从数据加载、预处理(如标准化处理)、基础SVM模型构建到PSO优化流程的完整步骤。优化过程会针对不同的核函数(例如线性核、多项式核及径向基函数核等)进行参数寻优,并系统评估优化前后模型性能的差异。性能对比通常基于准确率、精确率、召回率及F1分数等多项分类指标展开,从而定量验证PSO算法在提升SVM模型分类能力方面的实际效果。 本研究通过一个具体的MATLAB实现案例,旨在演示如何将全局优化算法与机器学习模型相结合,以解决模型参数选择这一关键问题。通过此实践,研究者不仅能够深入理解SVM的工作原理,还能掌握利用智能优化技术提升模型泛化性能的有效方法,这对于机器学习在实际问题中的应用具有重要的参考价值。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值