题目描述
输入输出格式
输入格式:
输出格式:
输入输出样例
说明
数据:
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 }