POJ_1062 昂贵的聘礼【DFS】

来源:互联网 发布:冯绍峰双龙出洞 知乎 编辑:程序博客网 时间:2024/06/04 18:41

题意:

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