poj1062解题报告

来源:互联网 发布:淘宝恶意退款不退货 编辑:程序博客网 时间:2024/05/17 09:39

题意:就是一个搜索,但是是一颗树的搜索,在这里要以最方便的数据结构存放,以前每台做过这种树的题,也不会构造,现在给予自己的理解,也算可以自己做出来了。。

思路:我是用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);}

0 0