[dfs] 洛谷 P2535 收集资源

本文解析了一个算法竞赛题目,通过计算红点之间的距离和代价,使用深度优先搜索(DFS)策略来确定在限定时间内能获取的最大价值。文章详细介绍了实现代码,包括读取输入、计算最小距离、执行DFS遍历等关键步骤。

题目描述

输入输出格式

输入格式:

 

 

输出格式:

 

 

输入输出样例

输入样例#1:
8 8 10
1 1 3
2 2 4
3 3 5
3 4 3
4 3 2
4 4 6
5 5 7
6 6 8
输出样例#1:
28

说明

数据:

50%: 1<=N,M,T<=100

100%: 1<=N,M,T<=200

 

题解

  • 由于题目要求我们只用求出可以获得的最大价值,那么我们可直接两两算出红点的距离和代价
  • 然后dfs跑一遍就好了

代码

 1 #include <cstdio>
 2 #include <cstring>
 3 #define N 210
 4 using namespace std;
 5 __attribute__((optimize("-O3")))
 6 int n,m,T,f[N][N],ans,mn=0x7fffff,mx;
 7 bool vis[N];
 8 struct edge{ int x,y,v; }a[N];
 9 inline int min(int x,int y) { return x>y?y:x; }
10 inline int max(int x,int y) { return x>y?x:y; }
11 inline int abs(int x) { return x>0?x:-x; }
12 inline int read()
13 {
14     int x=0,f=1;
15     char ch=getchar();
16     while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }
17     while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
18     return x*f;
19 }
20 inline void dfs(int d,int x,int t)
21 {
22     if ((T-t)/mn*mx+x<=ans) return;
23     if (t+mn>=T) { ans=max(ans,x); return; }
24     int o=0;
25     for (register int i=1;i<=m;++i) if (!vis[i]&&t+f[d][i]<=T) o=1,vis[i]=1,dfs(i,x+a[i].v,t+f[d][i]),vis[i]=0;
26     if (!o) ans=max(ans,x);
27 }
28 int main()
29 {
30     n=read(),m=read(),T=read();
31     for (register int i=1;i<=m;++i) a[i].x=read(),a[i].y=read(),a[i].v=read(),mx=max(mx,a[i].v);
32     for (register int i=0;i<=m;++i)
33         for (register int j=i+1;j<=m;++j) f[i][j]=f[j][i]=abs(a[i].x-a[j].x)+abs(a[i].y-a[j].y),mn=min(f[i][j],mn);
34     if (mn==0) mn=3;
35     dfs(0,0,0),printf("%d",ans);
36 }

 

转载于:https://www.cnblogs.com/Comfortable/p/10340565.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值