题意:
一件物品本事有一个价值,他可以用另一件物品加上某个价值进行兑换。问得到物品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;
}