灰色的果实

灰色的果实

问题描述
树为灰色果实之树,不定时会长出灰色果实。贸然接近果实只会使得自己受其迷惑最后神经错乱而
浑浑噩噩不得终日,与死人无异。你的目标是成功到达树的顶端,砍下灰色果实的灵脉。
为了能够免除灰色果实的影响,你需要在灰色果实力量微弱时在树的各个点
设置若干个保护点,保护点内燃烧着镇定人心的香,以此来抵御灰色果实的精神
袭击。一个点必须在 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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值