NYOJ 510 昂贵的聘礼 dfs

来源:互联网 发布:淘宝军用匕首 编辑:程序博客网 时间:2024/06/06 02:13
#include <stdio.h>#include <string.h>#define N 110struct Node{    int p;              // 价格    int l;              // 等级    int x;              // 替代品数量    int num[N];         // 替代品编号    int money[N];           // 优惠价格};int m, ans;             // 地位差, 最小花费Node a[N];              // 邻接表bool bz[N];             // 标记数组(用于判重)void dfs(int k, int left, int right, int count)         // k是当前物品编号, left、right是允许的等级的上下界, count是k之前的最小花费{    bz[k] = 1;    if(a[k].l < left || a[k].l > right) return;       // 判断是否越界    if(a[k].l - m > left) left = a[k].l - m;     // 更新左右边界(只能缩小)    if(a[k].l + m < right) right = a[k].l + m;    if(a[k].p + count < ans) ans = a[k].p + count;       // 更新ans    for(int i = 0; i < a[k].x; i ++){        int t = a[k].num[i];                // 检查替代品        if(bz[t]) continue;             // 检查是否走过        bz[t] = 1;        dfs(t, left, right, count + a[k].money[i]);        bz[t] = 0;    }}int main(){    int n;    while(1){        memset(bz, 0, sizeof(bz));        scanf("%d%d", &m, &n);        if(!m && !n) break;        for(int i = 1; i <= n; i ++){            scanf("%d%d%d", &a[i].p, &a[i].l, &a[i].x);            for(int j = 0; j < a[i].x; j ++){                scanf("%d%d", &a[i].num[j], &a[i].money[j]);            }        }        ans = a[1].p;        dfs(1, a[1].l - m, a[1].l + m, 0);        printf("%d\n", ans);    }    return 0;}
0 0
原创粉丝点击