[dfs] 洛谷 P2535 收集资源

题目描述

输入输出格式

输入格式:

 

 

输出格式:

 

 

输入输出样例

输入样例#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 }

 

posted @ 2019-01-31 09:29  BEYang_Z  阅读(188)  评论(0编辑  收藏  举报