POJ 1062 昂贵的聘礼

vj链接:https://cn.vjudge.net/problem/OpenJ_Bailian-1062

题目可以转换为最短路线的问题,首先,关于每个物品的原价,可以假设有一个源点(设下标为0),即物品到这个源点的距离。1可以用2加x元换,那么可以用一条1到2的距离为x的路线表示,这样,问题就转换成了求1到0的最短距离。
(这样设计路线可能怪怪的,可以把方向反过来)

还有一个需要解决的问题,就是这个部落的等级问题(一开始我以为是路线上的相邻点的等级不超过m就可以,理解错了)

要求一条路径上,等级最高的点与等级最低的点的差值不超过m

我是没想出思路来,用过深搜去除路径上的不合规则的点,超时超内存。。
看了别人的思路,差值不超过m,可以假设路径上所有的点的等级都在区间[x,y],内(y-x=m)因为求1到0的路径,所以1的等级一定在区间内,所以可以从x=(1的等级) 到 x=(1的等级+m) 枚举一遍

那么大体流程如下:
读入点的信息
枚举区间,根据每个区间建立图(点的等级在区间内就在图中加入相关的线),根据这个图,求1到0的最短路线,更新最小值
输出多次最短路线的最小值

#include <cstdio>
#include <cstring>
#include <algorithm>
#define Max 2000000
using namespace std;

struct OB{
    int p,l,x;
    int ne_t[105];
    int ne_v[105];
}ob[105];

int mp[105][105], r[105], book[105];
int m,n;
int fmi(){
    int ret, mi=Max+1;
    for(int i=0; i<=n; i++){
        if(book[i]) continue;
        if(r[i]<mi){
            mi = r[i];
            ret = i;
        }
    }
    book[ret] = 1;
    return ret;
}

int main()
{
    while(~scanf("%d%d",&m,&n)){
        for(int i=1; i<=n; i++){
            scanf("%d%d%d",&ob[i].p, &ob[i].l ,&ob[i].x);
            for(int j=1 ;j<=ob[i].x; j++){
                scanf("%d%d",&ob[i].ne_t[j], &ob[i].ne_v[j]);
            }
        }
        int L,H,an=Max;
        for(H=ob[1].l; H<=ob[1].l+m; H++){
            L = H-m;
            for(int i=0; i<=n; i++){ //清零
                for(int j=0; j<=n; j++){
                    if(i==j) mp[i][j] = 0;
                    else mp[i][j] = Max;
                }
            }
            int ne;
            for(int i=1; i<=n; i++){//建图
                if(ob[i].l>H || ob[i].l<L) continue;
                mp[i][0] = ob[i].p;
                for(int j=1; j<=ob[i].x; j++){
                    ne = ob[i].ne_t[j];
                    mp[i][ne] = min(mp[i][ne],ob[i].ne_v[j]);
                }
            }
            for(int i=0; i<=n; i++){
                r[i] = mp[1][i];
            }
            memset(book,0,sizeof(book));
            int k;
            for(int i=1; i<=n; i++){ //n+1个点 n次
                k = fmi();
                for(int j=0; j<=n; j++){
                    r[j] = min(r[j],r[k]+mp[k][j]);
                }
            }
            an = min(an,r[0]);
        }
        printf("%d\n",an);
    }
}

Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值