当前位置: 首页 > news >正文

POJ - 1062 昂贵的聘礼(最短路Dijkstra)

昂贵的聘礼
Time Limit: 1000MS
Memory Limit: 10000KB
64bit IO Format: %I64d & %I64u

SubmitStatus

Description

年轻的探险家来到了一个印第安部落里。

在那里他和酋长的女儿相爱了,于是便向酋长去求亲。酋长要他用10000个金币作为聘礼才答应把女儿嫁给他。探险家拿不出这么多金币,便请求酋长减少要求。

酋长说:"嗯,假设你能够替我弄到大祭司的皮袄。我能够仅仅要8000金币。假设你能够弄来他的水晶球。那么仅仅要5000金币即可了。"探险家就跑到大祭司那里。向他要求皮袄或水晶球。大祭司要他用金币来换,或者替他弄来其它的东西,他能够减少价格。

探险家于是又跑到其它地方,其它人也提出了类似的要求。或者直接用金币换,或者找到其它东西就能够减少价格。只是探险家不是必需用多样东西去换一样东西,由于不会得到更低的价格。

探险家如今非常须要你的帮忙,让他用最少的金币娶到自己的心上人。另外他要告诉你的是,在这个部落里,等级观念十分森严。

地位差距超过一定限制的两个人之间不会进行不论什么形式的直接接触,包含交易。他是一个外来人,所以能够不受这些限制。可是假设他和某个地位较低的人进行了交易,地位较高的的人不会再和他交易,他们觉得这样等于是间接接触,反过来也一样。因此你须要在考虑全部的情况以后给他提供一个最好的方案。
为了方便起见,我们把全部的物品从1開始进行编号。酋长的允诺也看作一个物品,而且编号总是1。

每一个物品都有相应的价格P,主人的地位等级L。以及一系列的替代品Ti和该替代品所相应的"优惠"Vi。假设两人地位等级差距超过了M。就不能"间接交易"。你必须依据这些数据来计算出探险家最少须要多少金币才干娶到酋长的女儿。

Input

输入第一行是两个整数M,N(1 <= N <= 100),依次表示地位等级差距限制和物品的总数。

接下来依照编号从小到大依次给出了N个物品的描写叙述。每一个物品的描写叙述开头是三个非负整数P、L、X(X < N),依次表示该物品的价格、主人的地位等级和替代品总数。接下来X行每行包含两个整数T和V,分别表示替代品的编号和"优惠价格"。

Output

输出最少须要的金币数。

Sample Input

1 4
10000 3 2
2 8000
3 5000
1000 2 1
4 200
3000 2 1
4 200
50 2 0

Sample Output


5250


思路:用Dijkstra求有向图的最短路。

每一个物品看成一个节点,酋长的允诺也看作一个物品(规定编号为1), 假设一个物品加上金币能够交换还有一个物品。则这两个节点之间有边,权值为金币数。求第一个节点到全部节点的最短路。由于有等级限制。所以枚举每一个点作为最低等级,选取符合全部符合等级限制的点。

设置源点为0,转化为求从0到1的最短路。

构图要注意。有等级限制,两个物品的等级之差不能超过 m。所以应该是建立有向图。 A->B,  用A物品交换得到B物品,要加上value价值,也就是A->B的权值为value。


<span style="font-size:18px;"><span style="font-size:18px;">#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <string>
#include <algorithm>
#include <queue>
#include <stack>
using namespace std;

const double PI = acos(-1.0);
const double e = 2.718281828459;
const double eps = 1e-8;
const int INF = 0x7fffffff;
const int MAXN = 110;
int g[MAXN][MAXN];
int dist[MAXN];
int level[MAXN];
int vis[MAXN];
int n, m;

int Dijkstra()
{   //从0到1的最短路
    int u, temp;
    for(int i = 0; i <= n; i++)
        dist[i] = g[0][i];
    vis[0] = 1;
    for(int i = 1; i <= n; i++)
    {
        u = 0;
        temp = INF;
        for(int j = 0; j <= n; j++)
        {
            if(!vis[j] && temp>dist[j])
            {
                temp = dist[j];
                u = j;
            }
        }
        if(u == 0)
            break;
        vis[u] = 1;
        for(int j = 1; j <= n; j++)
        {
            if(!vis[j] && g[u][j]!=INF && dist[j]>dist[u]+g[u][j])
                dist[j] = dist[u]+g[u][j];
        }
    }
    return dist[1];
}
int main()
{
    //freopen("in.txt", "r", stdin);
    //freopen("out.txt", "w", stdout);
    while(cin>>m>>n)
    {
        for(int i = 0; i <= n; i++)
        {
            for(int j = 0; j <= n; j++)
            {
                g[i][j] = (i==j)?

0:INF; } } memset(level, 0, sizeof(level)); int p, l, x; int t, v; for(int i = 1; i <= n; i++) { scanf("%d %d %d", &p, &l, &x); g[0][i] = p; //不用中间交换物,原本须要的金钱 level[i] = l; //记录该物品的等级 while(x--) { scanf("%d %d", &t, &v); g[t][i] = v; //用t交换得到i,要加上的金钱 } } int temp = INF; int minprice = INF; int maxlv; for(int i = 1; i <= n; i++) { maxlv = level[i]; //把当前物品的等级临时看做最高等级 for(int j = 1; j <= n; j++) { //当其他物品j的等级比当前物品高(保证单向性),或者两者等级之差超出限制m时 if(level[j]>maxlv || maxlv-level[j]>m) vis[j] = 1; //忽略这个点 else vis[j] = 0; } temp = Dijkstra(); minprice = min(minprice, temp); //维护最小值 } cout<<minprice<<endl; } return 0; } </span>



相关文章:

  • openssl生成https证书 (转)
  • vue单文件里name属性是做什么的?
  • JS题目及答案整理
  • docker 构建dockerfile
  • 重构摘要11_处理概括关系
  • 自定义reg52.h头文件(单片机学习重难点核心知识点)
  • leetcode46 Permutation 排列组合
  • Cocos2D-X2.2.3学习笔记8(处理精灵单击、双击和三连击事件)
  • 无法抗拒Minecraft给予超高的自由度和探索-微访谈
  • 移动端播放视频文件
  • 《Spring 5官方文档》翻译邀请
  • 树莓派玩耍笔记1 -- 开箱 amp; 安装系统以及简单配置
  • Bzoj4161 Shlw loves matrixI
  • 《Spring Data 官方文档翻译》3. 其他帮助资源
  • rdiff-backup:一个 Linux 中的远程增量备份工具
  • ES6指北【2】—— 箭头函数
  • [译]Python中的类属性与实例属性的区别
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • Elasticsearch 参考指南(升级前重新索引)
  • ES10 特性的完整指南
  • hadoop集群管理系统搭建规划说明
  • isset在php5.6-和php7.0+的一些差异
  • JavaScript设计模式与开发实践系列之策略模式
  • jdbc就是这么简单
  • JS数组方法汇总
  • LeetCode18.四数之和 JavaScript
  • MobX
  • Mybatis初体验
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • SOFAMosn配置模型
  • windows下mongoDB的环境配置
  • 代理模式
  • 力扣(LeetCode)21
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 如何利用MongoDB打造TOP榜小程序
  • 如何学习JavaEE,项目又该如何做?
  • 小程序01:wepy框架整合iview webapp UI
  • PostgreSQL之连接数修改
  • 大数据全解:定义、价值及挑战
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • # Apache SeaTunnel 究竟是什么?
  • # Java NIO(一)FileChannel
  • (初研) Sentence-embedding fine-tune notebook
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (转)创业家杂志:UCWEB天使第一步
  • (转载)OpenStack Hacker养成指南
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • .chm格式文件如何阅读
  • .java 9 找不到符号_java找不到符号
  • .NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .NET多线程执行函数
  • @Builder用法