POJ-1062 昂贵的聘礼 有限制的最短路
题目链接:https://cn.vjudge.net/problem/POJ-1062
题意
虽然是中文题,还是简单复述一下吧
我们想要酋长的女儿作为老婆。作为交换,酋长想要点钱。
酋长提出可以用其他人的东西来降低价格,然而其他人也想通过别人的东西来降低他们的价格。
由于每个人等级不一样,所以在每一条“交易链”中,不能出现地位差值大于M的情况。
求老婆的最小价值
思路
直接转化为最短路问题,难点在于如何处理地位差和物品价格(老婆价值=边权和+物品价格)的问题
- 受到Dijkstra的启发,我们可以设两个数组minLevel, maxLevel作为某交易链中的最小地位和最大地位 
 这样在松驰操作前,可以直接判断该节点可否更新(地位是否可行)
- 物品价格更好处理,处理完边权后,在dist上直接加价格即可 
代码
#include <queue>
#include <vector>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=110, maxm=maxn*maxn, INF=0x3f3f3f3f;
typedef pair<long long, int> Node;
struct Edge{
    int to, next;
    long long cost;
    Edge(int to=0, int next=9, long long cost=0):
        to(to), next(next), cost(cost) {}
}edges[maxm+5];
struct Cmp{
    bool operator () (const Node &a, const Node &b){
        return a.first>b.first;
    }
};
struct Point{
    long long price;
    int level;
    Point(long long price=0, int level=0):
        price(price), level(level) {}
}points[maxn+5];
int head[maxn], esize, minlv[maxn+5], maxlv[maxn+5], n, m;
long long dist[maxn+5];
void addEdge(int from, int to, long long cost){
    edges[esize]=Edge(to, head[from], cost);
    head[from]=esize++;
}
void init(void){
    memset(head, -1, sizeof(head));
    esize=0;
}
inline bool outer(const int &to, const int &from){
    if (abs(minlv[from]-points[to].level)<=m && abs(maxlv[from]-points[to].level)<=m)
        return false;
    return true;
}
long long Dij(void){
    priority_queue<Node, vector<Node>, Cmp> que;
    memset(dist, INF, sizeof(dist)); dist[1]=0;
    memset(maxlv, 0, sizeof(maxlv));
    memset(minlv, INF, sizeof(minlv));
    maxlv[1]=minlv[1]=points[1].level;
    que.push(Node(dist[1], 1));
    while (que.size()){
        Node x=que.top(); que.pop();
        if (x.first!=dist[x.second]) continue;
        int &from=x.second;
        for (int i=head[from]; i!=-1; i=edges[i].next){
            Edge &e=edges[i];
            int &to=e.to, &level=points[to].level;
            long long &dis=e.cost;
            if (outer(to, from) || dist[to]<=dist[from]+dis) continue;
            dist[to]=dist[from]+dis;
            maxlv[to]=max(maxlv[from], level);
            minlv[to]=min(minlv[from], level);
            que.push(Node(dist[to], to));
        }
    }
    long long ans=INF;
    for (int i=1; i<=n; i++)
        ans=min(dist[i]+points[i].price, ans);
    return ans;
}
int main(void){
    int price, level, x, to;
    long long cost;
    while (scanf("%d%d", &m, &n)==2 && n){
        init();
        for (int from=1; from<=n; from++){
            scanf("%lld%d%d", &points[from].price, &points[from].level, &x);
            for (int i=0; i<x; i++){
                scanf("%d%lld", &to, &cost);
                addEdge(from, to, cost);
            }
        }
        printf("%lld\n", Dij());
    }
    return 0;
}
| Time | Memory | Length | Lang | Submitted | 
|---|---|---|---|---|
| None | 360kB | 2482 | C++ | 2018-05-31 18:30:11 | 
POJ-1062 昂贵的聘礼 有限制的最短路的更多相关文章
- 最短路(Dijkstra) POJ 1062 昂贵的聘礼
		题目传送门 /* 最短路:Dijkstra算法,首先依照等级差距枚举“删除”某些点,即used,然后分别从该点出发生成最短路 更新每个点的最短路的最小值 注意:国王的等级不一定是最高的:) */ #i ... 
- POJ 1062 昂贵的聘礼(图论,最短路径)
		POJ 1062 昂贵的聘礼(图论,最短路径) Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女 ... 
- poj 1062 昂贵的聘礼 (dijkstra最短路)
		题目链接:http://poj.org/problem?id=1062 昂贵的聘礼 Time Limit: 1000MS Memory Limit: 10000K Total Submission ... 
- POJ 1062 	昂贵的聘礼
		C - 昂贵的聘礼 Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u Submit St ... 
- 最短路POJ 1062 	昂贵的聘礼
		C - 昂贵的聘礼 Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u Submit St ... 
- POJ 1062 昂贵的聘礼(带限制条件的dijkstra)
		题目网址:http://poj.org/problem?id=1062 题目: 昂贵的聘礼 Time Limit: 1000MS Memory Limit: 10000K Total Submis ... 
- POJ -1062 昂贵的聘礼(前向星 && SPFA)
		版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u013497151/article/details/30299671 题目链接:id=1062&qu ... 
- POJ 1062 昂贵的聘礼 (最短路)
		昂贵的聘礼 题目链接: http://acm.hust.edu.cn/vjudge/contest/122685#problem/M Description 年轻的探险家来到了一个印第安部落里.在那里 ... 
- POJ 1062 昂贵的聘礼(最短路中等题)
		昂贵的聘礼 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 51879 Accepted: 15584 Descripti ... 
- poj 1062 昂贵的聘礼 (最短路径)
		昂贵的聘礼 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 33365 Accepted: 9500 Descriptio ... 
随机推荐
- Code Snippet 插件 使用——代码高亮
			Code Snippet 下载地址 下载后安装,重启windows live writer 插入-->CodeSnippet 将代码粘贴进去,如图: 代码效果: @Controllerpubli ... 
- ZBrush中的布料技巧分享
			今天主要给大家介绍一种在ZBrush®3D图形绘制软件中创建特定类型的布料的技巧,这种方法简单却非常强大. 这个想法源自下面这张图: 我们今天所要讲的技巧可能不是实现复杂的服装设计最有效的方法,但确实 ... 
- poj1050查找最大子矩阵和
			题目: To the Max Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 48507 Accepted: 2566 ... 
- .net基础总复习(3)
			第三天 2.单例模式 1) 将构造函数私有化 2) 提供一个静态方法,返回一个对象 3) 创建一个单例 3.XML 可扩展的标记语言 XML:存储数据 注意: XML严格区分大小写,并且成对出现 ... 
- 小程序做一个能够左右滑动切换的多tab页面
			主要原理:使用 <swiper> 和 <scroll-view> 组件 代码片段: https://developers.weixin.qq.com/s/mLx4FWmF757 ... 
- linux内核(四)内存管理单元MMU
			1,基本概念 一个程序运行时没必要全部都同时装入内存,只需要把当前需要运行的部分装入内存即可,这样就使得一个大程序可以在较小的内存中运行,也使得内存中可以同时装入更多的程序并发执行,从用户角度看,该系 ... 
- POJ 3749
			第一道简单密码学的题,太水了,本不打算做,第一道,还是纪念一下. #include <iostream> #include <cstdio> #include <cstr ... 
- IntelliJ IDEA 初始化项目时No Java SDK Found
			IntelliJ IDEA 初始化项目时No Java SDK Found 自己在Project SDK后面的New按钮进行JDK的添加: 
- C++的标准模板库STL中实现的数据结构之链表std::list的分析与使用
			摘要 本文主要借助对C++的标准模板库STL中实现的数据结构的学习和使用来加深对数据结构的理解,即联系数据结构的理论分析和详细的应用实现(STL),本文是系列总结的第二篇.主要针对线性表中的链表 ST ... 
- ZOJ 3829 模拟贪心
			2014牡丹江现场赛水题 给出波兰式,推断其是否合法.假设不合法有两种操作: 1:任何位置加一个数字或者操作符 2:随意两个位置的元素对调 贪心模拟就可以 先推断数字数是否大于操作符数,若不大于 an ... 
