POJ_1062 昂贵的聘礼【DFS】

题意:

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


  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值