gym102391I Minimum Diameter Spanning Tree 带权最小直径生成树

本文介绍了一种在加权图中寻找绝对中心的方法,并通过调整边权重确保中心到各点距离为整数。该方法利用Floyd算法进行最短路径计算,并通过比较不同节点作为起点时的最长距离来确定图的中心。

https://codeforces.com/gym/102391/problem/I

学习自https://blog.youkuaiyun.com/crazy_ac/article/details/8816877

板题做了一个下午,头快想烂了

首先找到图的绝对中心,然后由于边权不为1,所以把所有边权都*2,然后中心到其他点的距离也会是整数了,确定中心后就从u,v开始跑,记得dis[u],dis[v]要设为真正的初始值。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

const int maxl=510;
const ll inf=1ll<<61;

int n,m,s1,s2,tot;ll ans;
int frm[maxl],ansx[maxl],ansy[maxl];
ll dis[maxl];
ll d[maxl][maxl],w[maxl][maxl],rk[maxl][maxl];
typedef pair<ll,int> p;
priority_queue<p,vector<p>,greater<p> >q;
vector<int> e[maxl];
bool vis[maxl];

inline void prework()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			w[i][j]=d[i][j]=inf;
	for(int i=1;i<=n;i++)
		w[i][i]=d[i][i]=0;
	int u,v,l;
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d%d",&u,&v,&l);l*=2;
		d[u][v]=d[v][u]=w[u][v]=w[v][u]=l;
		e[u].push_back(v);e[v].push_back(u);
	}
}

inline ll findct()
{
	for(int k=1;k<=n;k++)
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
				d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
			rk[i][j]=j;
		for(int j=1;j<=n;j++)
			for(int k=j+1;k<=n;k++)
			if(d[i][rk[i][j]]>d[i][rk[i][k]])
				swap(rk[i][j],rk[i][k]);
	}
	ll mi=inf;
	for(int u=1;u<=n;u++)
		for(int v:e[u])
		{
			if(u>v)
				continue;
			if((d[u][rk[u][n]]*2)<mi)
			{
				dis[s1]=dis[s2]=inf;
				mi=d[u][rk[u][n]]*2,s1=s2=u,dis[u]=0;
			}
			if((d[v][rk[v][n]]*2)<mi)
			{
				dis[s1]=dis[s2]=inf;
				mi=d[v][rk[v][n]]*2,s1=s2=v,dis[v]=0;
			}
			for(int last=n,i=n-1;i;i--)
			if(d[v][rk[u][i]]>d[v][rk[u][last]])
			{
				ll tmp=d[u][rk[u][i]]+d[v][rk[u][last]]+w[u][v];
				if(tmp<mi)
				{	
					dis[s1]=dis[s2]=inf;
					mi=tmp;s1=u,s2=v;
					dis[s1]=tmp/2-d[u][rk[u][i]];
					dis[s2]=w[u][v]-dis[s1];
				}
				last=i;
			}
		}
	return mi/2;
}

inline void mainwork()
{
	for(int i=1;i<=n;i++)
		dis[i]=inf,vis[i]=false;
	ans=findct();
	if(s1!=s2)
		q.push({dis[s1],s1}),q.push({dis[s2],s2});
	else
		q.push({dis[s1],s1});
	tot=0;
	if(s1!=s2)
		++tot,ansx[1]=s1,ansy[1]=s2;
	int u;p d;
	while(q.size())
	{
		d=q.top();q.pop();
		u=d.second;
		if(d.first!=dis[u] || vis[u])
			continue;
		vis[u]=true;
		if(u!=s1 && u!=s2)
			++tot,ansx[tot]=frm[u],ansy[tot]=u;
		for(int v:e[u])
		{
			if(dis[v]<=dis[u]+w[u][v])
				continue;
			dis[v]=dis[u]+w[u][v];frm[v]=u;
			q.push({dis[v],v});
		}
	}
}

inline void print()
{
	printf("%lld\n",ans);
	for(int i=1;i<=n-1;i++)
		printf("%d %d\n",ansx[i],ansy[i]);
}

int main()
{
	prework();
	mainwork();
	print();
	return 0;
} 

 

<think>好的,用户需要查找关于宇树科技的强化学习Gym环境搭建方法或教程。首先,我需要回忆一下宇树科技的相关信息。根据之前的引用,宇树科技B2-W机器人使用了强化学习完成复杂动作,比如托马斯全旋和侧空翻,并且他们的运动控制算法支持高速运动和动态平衡。不过用户提供的引用里并没有直接提到Gym环境的搭建方法,所以可能需要从其他途径获取信息。 接下来,我应该考虑用户可能的需求。用户可能正在尝试使用宇树科技的机器人平台,比如B1或B2系列,在强化学习框架(如OpenAI Gym)中进行算法训练。Gym环境搭建通常涉及接口开发、动作空间和观察空间的定义,以及奖励函数的设计。 由于宇树科技官方可能提供了一些SDK或者API,用户需要先安装这些工具包。可能需要参考官方文档,比如GitHub仓库或者开发者社区。另外,仿真环境可能依赖于MuJoCo、PyBullet等物理引擎,用户需要确认宇树是否提供了对应的模型文件。 然后,用户可能需要示例代码来连接Gym环境。例如,如何将机器人的传感器数据转化为观察空间,如何发送控制指令作为动作空间。同时,强化学习训练中的奖励函数设计是关键,需要根据具体任务来制定,比如平衡、行走或跳跃。 另外,用户可能会遇到问题,比如环境接口兼容性、实时控制延迟或者仿真与实物的差异。这时候需要建议他们查阅宇树科技的官方资源,或者参与开发者论坛寻求帮助。 最后,考虑到用户之前的问题涉及动态平衡算法和实时反馈控制,可能在搭建Gym环境时需要集成这些方面的模块,比如ZMP稳定性判断或者高精度动力学仿真。需要提醒用户在环境中集成必要的控制算法,并参考已有的强化学习案例进行调试。</think>关于宇树科技强化学习Gym环境搭建的技术路径,目前公开资料较少,但可通过以下步骤实现原型开发: ### 一、基础环境配置 1. **硬件接口层** - 需安装宇树机器人SDK(如Unitree SDK) - 配置ROS/ROS2中间件实现实时通信 ```bash sudo apt-get install ros-$ROS_DISTRO-unitree-ros ``` - 建立CAN总线通信协议,波特率建议设置为1Mbps[^1] 2. **仿真环境构建** ```python from unitree_sdk import UnitreeGymEnvBase import gym class B2Env(UnitreeGymEnvBase): def __init__(self): super().__init__(model_path='b2_with_arm.xml', control_freq=500, motor_kp=100.0, motor_kd=1.0) ``` ### 二、强化学习要素定义 1. **状态空间构建** $$s_t = [q,\dot{q},\tau_{ext},f_{zmp}] \in \mathbb{R}^{38}$$ 包含关节角度$q$、角速度$\dot{q}$、外部力矩$\tau_{ext}$和零力矩点坐标$f_{zmp}$ 2. **奖励函数设计** ```python def reward_func(state, action): balance_r = -10*||f_{zmp}||^2 energy_r = -0.1*||\tau||^2 task_r = 2.0*(body_height - target_height) return balance_r + energy_r + task_r ``` ### 三、训练框架集成 ```python env = gym.make('B2-v0') model = PPO("MlpPolicy", env, n_steps=4096, batch_size=64, ent_coef=0.01) model.learn(total_timesteps=1e6) ``` **技术难点**: 1. 需处理500Hz实时控制与RL算法低帧率的频率匹配 2. 需补偿仿真环境$(\mu=0.6)$与真实地面$(\mu=0.8-1.2)$的摩擦系数差异[^1] 3. 动态平衡约束需满足$||f_{zmp}|| \leq \delta_{safe}$ 建议访问宇树科技GitHub官方仓库获取最新接口: https://github.com/unitreerobotics
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值