POJ

xiaoxiao2021-02-27  118

题意:

一件物品本事有一个价值,他可以用另一件物品加上某个价值进行兑换。问得到物品1需要花费最少的价值是多少。

注意是任意两个人等级之差都不能超过m

思路:

此题神坑...酋长的等级不一定是最高的,而且还可能有内环,要注意标记

注意要判断路径内最小等级与最大等级之差,不能只判断一个

ans=min(ans,price+G[t].p);是在每次递归都需要进行运算的,而不是在递归结束条件里进行。因为可能在兑换过程中ans会达到最小值。

代码部分:

#include<bits/stdc++.h> //c++万能头文件 using namespace std; struct good { int p; int le; int n; int a[105]; map<int,int>M; }; int vis[105]; int M; int ans; int Min,Max; void dfs(good G[],int t,int price) { ans=min(ans,price+G[t].p); if(G[t].n==0)return; for(int i=1; i<=G[t].n; i++) { int pric=price; if(abs(G[G[t].a[i]].le-Max)<=M&&abs(G[G[t].a[i]].le-Min)<=M&&vis[G[t].a[i]]==0) { int temp=G[t].M[G[t].a[i]]; pric+=temp; if(pric>ans) continue; if(G[G[t].a[i]].le>Max) Max=G[G[t].a[i]].le; if(G[G[t].a[i]].le<Min) Min=G[G[t].a[i]].le; vis[G[t].a[i]]=1; dfs(G,G[t].a[i],pric); vis[G[t].a[i]]=0; } } } int main() { int N; while(~scanf("%d%d",&M,&N)) { memset(vis,0,sizeof(vis)); good G[105]; for(int i=1; i<=N; i++) { int pr,l,nu;int num,pri; scanf("%d%d%d",&pr,&l,&nu); G[i].p=pr;G[i].le=l;G[i].n=nu; for(int j=1; j<=nu; j++) { scanf("%d%d",&num,&pri); G[i].a[j]=num; G[i].M[num]=pri; } } ans=G[1].p;Min=G[1].le;Max=G[1].le;vis[1]=1; dfs(G,1,0); printf("%d\n",ans); } return 0; }
转载请注明原文地址: https://www.6miu.com/read-17136.html

最新回复(0)