灰色的果实

本文介绍了一个基于树形结构的问题——如何在限定时间内设置保护点以抵御灰色果实的影响,确保能够成功砍下果实的灵脉。文章提供了两种解决方案,一种是通过暴力枚举的方式寻找最优解,另一种则是采用树形DP的方法求解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

灰色的果实

问题描述
树为灰色果实之树,不定时会长出灰色果实。贸然接近果实只会使得自己受其迷惑最后神经错乱而
浑浑噩噩不得终日,与死人无异。你的目标是成功到达树的顶端,砍下灰色果实的灵脉。
为了能够免除灰色果实的影响,你需要在灰色果实力量微弱时在树的各个点
设置若干个保护点,保护点内燃烧着镇定人心的香,以此来抵御灰色果实的精神
袭击。一个点必须在 lim[i]距离以内有保护点才能收到保护。而且,由于在树上
作业,地形十分崎岖,使得不同点设置保护点的作业时间 time[i]不同。
谋求最大的效率,请求出保护点笼罩整棵树所需的最短作业时间。
输入格式
第一行一个整数 n 表示树的初始节点数。
第二行 n 个整数 time[i] ,表示此点设置保护点的作业时间。
第三行 n 个整数 lim[i] ,表示点受到保护的限制距离。
第四行到第 n+3 行为树的初始边,有三个整数 x,y,z,代表 x 到 y 有一
条长度为 z 的枝条。
输出格式
一个数为保护点笼罩整棵树所需的最短作业时间。
样例输入(input.txt)
Sample1 Sample2
5
1 1 1 1 1
1 1 1 1 1
1 2 1
2 3 1
3 4 1
4 5 1
4
2 1 1 1
3 4 3 2
1 2 3
1 3 3
1 4 2
样例输出(output.txt)
Sample1 Sample2
2 2
数据范围
数据点 限制 其它限制
1
n≤20
边权≤150
保护所修建费用≤1000
这些都不重要
2
3
4
5
6
7
n≤100
8
9
10
11
n≤2000
12
13
14
15
16
17
18
19
20
注:[题意] 若有不懂的,可以理解为在 n 个点中设置若干个特殊点,使得特殊点保护
整棵树。
[答案] 答案保证在 int 范围之内。

30分暴力

Tips:lim[i]lim[i]

#include<cstdio>
#include<iostream>
#include<cstdlib>
using namespace std;
int n,num,ans,HA,ha;
int dis[2005][2005];
bool flag[2005],f[2005];
int tim[2005],lim[2005];
void dfs(int x,int zhi){
  if (zhi>=ans) return;
  if (zhi>1000) return;
  if (x>n){
    for (int i=1;i<=n;++i) flag[i]=true;

    int t=0;
    for (int i=1;i<=n;++i)
    if (f[i]==1){
      if (flag[i]){
        flag[i]=false;
        ++t;
      }
      for (int j=1;j<=n;++j)
      if (flag[j]&&dis[i][j]<=lim[j]){
        flag[j]=false;
        ++t;
      }
    }
    if (t==n) ans=min(ans,zhi);
    ++HA;
    return;
  }
  f[x]=1;
  dfs(x+1,zhi+tim[x]);
  f[x]=0;
  dfs(x+1,zhi);
}
int main(){
  scanf("%d",&n);
  num=0;
  for (int i=1;i<=n;++i) scanf("%d",&tim[i]);
  for (int i=1;i<=n;++i) scanf("%d",&lim[i]);
  for (int i=1;i<=n;++i) f[i]=0;
  for (int i=1;i<=n;++i)
    for (int j=1;j<=n;++j) dis[i][j]=1<<29;
  for (int i=1;i<n;++i){
    int u,v,z;
    scanf("%d%d%d",&u,&v,&z);
    dis[u][v]=z;
    dis[v][u]=z;
  }
  for (int k=1;k<=n;++k)
    for (int i=1;i<=n;++i)
    if (i!=k) 
      for (int j=1;j<=n;++j)
      if (k!=j&&i!=j)
        dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
  ans=1<<29;
  dfs(1,0);
  printf("%d\n",ans);
  return 0;
}

正解

DPdp[i][j]ij

bst[i]i

#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
int vet[4010],val[4010],Next[4010];
int hed[4010],vis[4010];
int dis[4010][4010],dp[4010][4010];
int tim[4010],lim[4010],bst[4010];
int num;
int n;
void add(int u,int v,int z){
  ++num;
  vet[num]=v;
  val[num]=z;
  Next[num]=hed[u];
  hed[u]=num;
}

void dfs(int x,int dis[]){
  queue<int> q;
  q.push(x);vis[x]=x;dis[x]=0;
  while (!q.empty()){
    int u=q.front();
    q.pop();
    for (int i=hed[u];i!=-1;i=Next[i]){
      int v=vet[i],z=val[i];
      if (vis[v]!=x){
        vis[v]=x;
        dis[v]=dis[u]+z;
        q.push(v);
      }
    }
  }
}
void check(int x,int fa){
  for (int i=hed[x];i!=-1;i=Next[i]){
    int v=vet[i];
    if (v==fa) continue;
    check(v,x);
  }
  for (int i=1;i<=n;++i)
  if (dis[x][i]<=lim[x]){
    dp[x][i]=0;
    for (int j=hed[x];j!=-1;j=Next[j]){
      int v=vet[j];
      if (v==fa) continue;
      dp[x][i]+=min(dp[v][i]-tim[i],bst[v]);

    }
    dp[x][i]+=tim[i];
    bst[x]=min(bst[x],dp[x][i]);
  }
}
int main(){
  scanf("%d",&n);
  for (int i=1;i<=n;++i) scanf("%d",&tim[i]);
  for (int i=1;i<=n;++i) scanf("%d",&lim[i]);
  for (int i=1;i<=n;++i){
    hed[i]=-1;
    vis[i]=0;
    bst[i]=1<<29;
    for (int j=1;j<=n;++j) dp[i][j]=1<<29;
  }
  for (int i=1;i<n;++i){
    int u,v,z;
    scanf("%d%d%d",&u,&v,&z);
    add(u,v,z);
    add(v,u,z);
  }
  for (int i=1;i<=n;++i) dfs(i,dis[i]);
  check(1,0);
  printf("%d\n",bst[1]);
  return 0;
}
开发语言:Java 框架:SSM(Spring、Spring MVC、MyBatis) JDK版本:JDK 1.8 或以上 开发工具:Eclipse 或 IntelliJ IDEA Maven版本:Maven 3.3 或以上 数据库:MySQL 5.7 或以上 此压缩包包含了本毕业设计项目的完整内容,具体包括源代码、毕业论文以及演示PPT模板。 项目配置完成后即可运行,若需添加额外功能,可根据需求自行扩展。 运行条件 确保已安装 JDK 1.8 或更高版本,并正确配置 Java 环境变量。 使用 Eclipse 或 IntelliJ IDEA 打开项目,导入 Maven 依赖,确保依赖包下载完成。 配置数据库环境,确保 MySQL 服务正常运行,并导入项目中提供的数据库脚本。 在 IDE 中启动项目,确认所有服务正常运行。 主要功能简述: 用户管理:系统管理员负责管理所有用户信息,包括学生、任课老师、班主任、院系领导和学校领导的账号创建、权限分配等。 数据维护:管理员可以动态更新和维护系统所需的数据,如学生信息、课程安排、学年安排等,确保系统的正常运行。 系统配置:管理员可以对系统进行配置,如设置数据库连接参数、调整系统参数等,以满足同的使用需求。 身份验证:系统采用用户名和密码进行身份验证,确保只有授权用户才能访问系统。同用户类型(学生、任课老师、班主任、院系领导、学校领导、系统管理员)具有同的操作权限。 权限控制:系统根据用户类型分配同的操作权限,确保用户只能访问和操作其权限范围内的功能和数据。 数据安全:系统采取多种措施保障数据安全,如数据库加密、访问控制等,防止数据泄露和非法访问。 请假审批流程:系统支持请假申请的逐级审批,包括班主任审批和院系领导审批(针对超过三天的请假)。学生可以随时查看请假申请的审批进展情况。 请假记录管理:系统记录学生的所有请假记录,包括请假时间、原因、审批状态及审批意见等,供学生和审批人员查询。 学生在线请假:学生可以通过系统在线填写请假申请,包括请假的起止日期和请假原因,并提交给班主任审批。超过三天的请假需经班主任审批后,再由院系领导审批。 出勤信息记录:任课老师可以在线记录学生的上课出勤情况,包括迟到、早退、旷课和请假等状态。 出勤信息查询:学生、任课老师、班主任、院系领导和学校领导均可根据权限查看同范围的学生上课出勤信息。学生可以查看自己所有学年的出勤信息,任课老师可以查看所教班级的出勤信息,班主任和院系领导可以查看本班或本院系的出勤信息,学校领导可以查看全校的出勤信息。 出勤统计与分析:系统提供出勤统计功能,可以按班级、学期等条件统计学生的出勤情况,帮助管理人员了解学生的出勤状况
开发语言:Java 框架:SSM(Spring、Spring MVC、MyBatis) JDK版本:JDK 1.8 或以上 开发工具:Eclipse 或 IntelliJ IDEA Maven版本:Maven 3.3 或以上 数据库:MySQL 5.7 或以上 此压缩包包含了本毕业设计项目的完整内容,具体包括源代码、毕业论文以及演示PPT模板。 项目配置完成后即可运行,若需添加额外功能,可根据需求自行扩展。 运行条件 确保已安装 JDK 1.8 或更高版本,并正确配置 Java 环境变量。 使用 Eclipse 或 IntelliJ IDEA 打开项目,导入 Maven 依赖,确保依赖包下载完成。 配置数据库环境,确保 MySQL 服务正常运行,并导入项目中提供的数据库脚本。 在 IDE 中启动项目,确认所有服务正常运行。 主要功能简述: 用户管理:系统管理员负责管理所有用户信息,包括学生、任课老师、班主任、院系领导和学校领导的账号创建、权限分配等。 数据维护:管理员可以动态更新和维护系统所需的数据,如学生信息、课程安排、学年安排等,确保系统的正常运行。 系统配置:管理员可以对系统进行配置,如设置数据库连接参数、调整系统参数等,以满足同的使用需求。 身份验证:系统采用用户名和密码进行身份验证,确保只有授权用户才能访问系统。同用户类型(学生、任课老师、班主任、院系领导、学校领导、系统管理员)具有同的操作权限。 权限控制:系统根据用户类型分配同的操作权限,确保用户只能访问和操作其权限范围内的功能和数据。 数据安全:系统采取多种措施保障数据安全,如数据库加密、访问控制等,防止数据泄露和非法访问。 请假审批流程:系统支持请假申请的逐级审批,包括班主任审批和院系领导审批(针对超过三天的请假)。学生可以随时查看请假申请的审批进展情况。 请假记录管理:系统记录学生的所有请假记录,包括请假时间、原因、审批状态及审批意见等,供学生和审批人员查询。 学生在线请假:学生可以通过系统在线填写请假申请,包括请假的起止日期和请假原因,并提交给班主任审批。超过三天的请假需经班主任审批后,再由院系领导审批。 出勤信息记录:任课老师可以在线记录学生的上课出勤情况,包括迟到、早退、旷课和请假等状态。 出勤信息查询:学生、任课老师、班主任、院系领导和学校领导均可根据权限查看同范围的学生上课出勤信息。学生可以查看自己所有学年的出勤信息,任课老师可以查看所教班级的出勤信息,班主任和院系领导可以查看本班或本院系的出勤信息,学校领导可以查看全校的出勤信息。 出勤统计与分析:系统提供出勤统计功能,可以按班级、学期等条件统计学生的出勤情况,帮助管理人员了解学生的出勤状况
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值