zju 2770

     题目很好理解,但是不懂得差分约束系统的人做起来比较困难。差分约束系统是图论问题中数形结合的一个很好的例子,它通过列出不等式,利用不等式间的关系构图,将原问题转化成常见的求单源最长路径或最短路径问题。一般地,给出一段线性区间(或者问题可以装化成线性区间问题),求该区间内可存在的最大数量(最小数量)的元素个数,就可考虑用差分约束模型(这是个人见解,我还没系统地做出总结)。

     对于本题,设d[i]为第0个兵营到第i个兵营至少的士兵个数,则有方程:

0=<d[i]-d[i-1]<=ci,ci为第i个兵营至少的士兵数。而从兵营i到j的士兵个数,则有方程:w=<d[j]-d[i-1]<=sum[i...j],其中sum[i...j]为从兵营i到j的至少士兵总数。用spfa算法解答。

 

      以下是代码:

    

      

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int M=12000;
const int N=1200;
const int inf=1<<29;

struct node
{
 int v,w;
 int next;
}edge[4*M];
int head[N],num;
int dis[N],d[N],tim[N];
bool vis[N];
int n,m;

void init()
{
 int i;
 for(i=0;i<=n+2;i++)
  head[i]=-1;
 num=0;
}

void addege(int u,int v,int w)
{
 edge[num].v=v;
 edge[num].w=w;
 edge[num].next=head[u];
 head[u]=num++;
}

bool spfa()
{
 int s=0;
 int queue[100*N+1],front=0,rear=0;
 int i,j;
 for(i=0;i<=n+1;i++)
 {
  vis[i]=0;
  dis[i]=-inf;
  tim[i]=0;
 }
 dis[s]=0;
 queue[rear++]=s;
 vis[s]=true;
 tim[s]++;
 while(front<rear)
 {
  i=queue[front++];
  vis[i]=false;
  for(j=head[i];j!=-1;j=edge[j].next)
  {
   int v=edge[j].v;
   if(dis[v]<dis[i]+edge[j].w)
   {
    dis[v]=dis[i]+edge[j].w;
    if(!vis[v])
    {
     vis[v]=1;
     queue[rear++]=v;
     tim[v]++;
    }
   }
   if(tim[v]>=n-1) return false;
  }
 }
 return true;
}

int main()
{
 while(scanf("%d%d",&n,&m)==2)
 {
  init();
  int i,j;
  int a,b,c;
  for(i=1;i<=n;i++)
  {
   scanf("%d",&d[i]);
   addege(i,i-1,-d[i]);
   addege(i-1,i,0);
  }
  for(i=0;i<m;i++)
  {
   scanf("%d%d%d",&a,&b,&c);
   int sum=0;
   for(j=a;j<=b;j++)
    sum+=d[j];
   addege(a-1,b,c);
   addege(b,a-1,-sum);
  }
  if(spfa())
   printf("%d/n",dis[n]);
  else
   printf("Bad Estimations/n");
 }
 return 0;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ZJU-I型机械臂是一种由浙江大学机器人研究所开发的六自由度机械臂,具有高速、精度和可靠性等特点。机械臂的运动控制是机器人中的重要研究领域之一,其中点到点轨迹规划是机器人在运动过程中最基础和常用的一种方式,也是机械臂控制的核心问题之一。 点到点轨迹规划的目标是通过给定的起点和终点,计算出机械臂的运动轨迹,使机械臂在运动过程中满足机械臂轨迹的连续性、平滑性、可控性等要求。在过去的研究中,经典的点到点轨迹规划方法包括插值法、线性规划法、最小能量法等。 如果使用Python实现机械臂的点到点轨迹规划,可以采用Robotics Toolkit(简称robot)这个模块。robot模块提供了各种从轨迹规划、控制到仿真的功能,可用于ROS、Vrep、Webots等机器人仿真软件。使用robot模块,可以通过几行代码实现机械臂的点到点轨迹规划,例如: ``` from roboticstoolkit import robot from roboticstoolkit.robots import zju # 初始化机器人 zju_arm = robot.Robot('zju', zju.URDF) # 设定起点和终点 start = [0, 0, 0, 0, 0, 0] goal = [0, 1, 1, 0.5, 0, 0] # 计算机械臂的轨迹 path = zju_arm.get_trajectory(start, goal) # 控制机械臂运动到终点 zju_arm.move_to(goal) ``` 其中,`roboticstoolkit`和`roboticstoolkit.robots`都是导入的Python模块,`zju`是机械臂的URDF定义文件,`start`和`goal`是起点和终点的坐标,`get_trajectory()`函数会返回计算得到的机械臂轨迹,`move_to()`函数则控制机械臂运动到终点。 总之,使用Python实现ZJU-I型机械臂的点到点轨迹规划相对简单,只需要导入相应的模块,并根据需要设置机械臂的各种参数,即可轻松实现机械臂的控制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值