题意:就是一个搜索,但是是一颗树的搜索,在这里要以最方便的数据结构存放,以前每台做过这种树的题,也不会构造,现在给予自己的理解,也算可以自己做出来了。。
思路:我是用DFS做的,思路比较简单,但是多了一个要求,等级!!但是只要认真分析就没事的。。
注意:1.酋长的等级不是最高的
2.探险家与地等级的交易,如果超过M,则高等级的不会与他再次交易,反过来也是,所以一定要记录探险家max_level和min_level;这样才可以成功的理解;;
附上我的AC代码::
#include<stdio.h>
int price[110];
int level[110];
int bian[110][110];
int cun[110][110];
int M,N;
int ma(int x,int y)
{
if(x>y)
return x;
return y;
}
int mi(int x,int y)
{
if(x>y)
return y;
return x;
}
void put()
{
scanf("%d%d",&M,&N);
for(int i=1;i<=N;i++)
{
int num;
int a,b;
scanf("%d%d%d",&price[i],&level[i],&num);
for(int j=1;j<=num;j++)
{
scanf("%d%d",&a,&b);
cun[a][++cun[a][0]]=i;
bian[a][i]=b;
}
}
}
int nowlevel;
int min=0x7fffffff;
void dfs( int x,int sum,int mil,int mal )
{
if(mal-mil>M||sum>=min)
return ;
if(x==1)
{
if(sum<min)
min=sum;
return;
}
for(int i=1;i<=cun[x][0];i++)
{
int c=cun[x][i];
dfs(c,sum+bian[x][c],mi(level[c],mil),ma(level[c],mal));
}
}
int main()
{
int sum;
put();
for(int i=1;i<=N;i++)
{
sum=price[i];
nowlevel=level[i];
dfs(i,sum,nowlevel,nowlevel);
}
printf("%d\n",min);
}