题目链接:https://vjudge.net/problem/POJ-1062

如图,我们可以把交换的情况,抽象为一个有向图,

先抛去等级限制,那么就是一个最短路,从①出发,到达其他点的最短路中

最短的那个就是我们需要的答案了。

当然松弛条件变成了  dis[now] - pos[now].w + w(now->to) + pos[to].w < dis[to],

这里,如果我们走了一条边,那么原来的最后加进去的物品的价格一定会发生改变,那么我们把原来的物品价格减去,

改成交换后的价格,然后要加上我们买to的那个物品的价格,然后与dis[to]比较。

等级限制,就是说你在交换物品的路上,你交换物品的所有商人集合记为P,某人商人记为px,

∀pi , pj∈P, abs(pi.level - pj.level) <= L.那么我们需要记录你一路上商人的等级,当然,我们只需要考虑极端情况就好了,

记录一个最低等级,一个最高等级,如果这两个满足,那么其他商人都会满足。代码会有解释。


 #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <stack>
#include <string>
#include <map>
#include <cmath>
#include <iomanip>
using namespace std; typedef long long LL;
#define inf 1e9
#define rep(i,j,k) for(int i = (j); i <= (k); i++)
#define rep__(i,j,k) for(int i = (j); i < (k); i++)
#define per(i,j,k) for(int i = (j); i >= (k); i--)
#define per__(i,j,k) for(int i = (j); i > (k); i--) const int N = ;
int head[N];
bool vis[N];
int dis[N];
int cnt;
int L,n; struct Pos{
int w;
int level;
}pos[N]; struct Edge{
int to;
int w;
int next;
}e[(int)1e7]; struct node{
int loc;//当前位置
int level_max;//之前的最高等级
int level_min;//最浅的最低等级
int dis;//距离
bool friend operator< (const node& a,const node& b){
return a.dis > b.dis;
}
}; priority_queue<node> que; void add(int u,int v,int w){
e[cnt].to = v;
e[cnt].w = w;
e[cnt].next = head[u];
head[u] = cnt++;
} //我们要交换的商人 与之前的最高和最低等级是否满足等级限制
inline bool check_loc(node& now,int to){
return abs(now.level_max - pos[to].level) <= L && abs(now.level_min - pos[to].level) <= L;
} void dijkstra(){ rep(i,,n) dis[i] = inf;
dis[] = pos[].w;
que.push(node{, pos[].level, pos[].level, dis[]}); node now;
int to,w;
while(!que.empty()){ now = que.top();
que.pop();
if(vis[now.loc]) continue;
vis[now.loc] = true; for(int o = head[now.loc]; ~o; o = e[o].next){
to = e[o].to;
w = e[o].w; if(dis[now.loc] - pos[now.loc].w + w + pos[to].w < dis[to] && check_loc(now,to)){
dis[to] = dis[now.loc] - pos[now.loc].w + w + pos[to].w;
//更新遇到的最高等级和最低等级
que.push(node{to, min(now.level_min, pos[to].level), max(now.level_max, pos[to].level),
                                                          dis[to]});
}
}
} int ans = inf;
rep(i,,n) ans = min(ans,dis[i]);
cout << ans << endl;
} int main(){ scanf("%d%d",&L,&n); rep(i,,n) head[i] = -;
cnt = ;
int tot,v,w;
rep(u,,n){
scanf("%d%d%d",&pos[u].w,&pos[u].level,&tot);
rep(j,,tot){
scanf("%d%d",&v,&w);
add(u,v,w);
}
} dijkstra(); getchar(); getchar();
return ;
}

昂贵的聘礼 POJ - 1062的更多相关文章

  1. (最短路 dijkstra)昂贵的聘礼 -- poj -- 1062

    链接: http://poj.org/problem?id=1062 昂贵的聘礼 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions ...

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

    年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长降低要求.酋长说:" ...

  3. 昂贵的聘礼 - poj 1062 (Dijkstra+枚举)

      Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 39976   Accepted: 11596 Description 年 ...

  4. POJ 1062 昂贵的聘礼

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

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

    题目传送门 /* 最短路:Dijkstra算法,首先依照等级差距枚举“删除”某些点,即used,然后分别从该点出发生成最短路 更新每个点的最短路的最小值 注意:国王的等级不一定是最高的:) */ #i ...

  6. Poj OpenJudge 百练 1062 昂贵的聘礼

    1.Link: http://poj.org/problem?id=1062 http://bailian.openjudge.cn/practice/1062/ 2.Content: 昂贵的聘礼 T ...

  7. POJ 1062 昂贵的聘礼(图论,最短路径)

    POJ 1062 昂贵的聘礼(图论,最短路径) Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女 ...

  8. poj 1062 昂贵的聘礼 (dijkstra最短路)

    题目链接:http://poj.org/problem?id=1062 昂贵的聘礼 Time Limit: 1000MS   Memory Limit: 10000K Total Submission ...

  9. 最短路POJ 1062 昂贵的聘礼

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

随机推荐

  1. tmux终端复用神器简单使用

    创建命名Tmux会话(tmux new -s session_name)tmux new -s session_name chongchong 暂退Tmux会话(Ctrl + a d)直接关窗口 返回 ...

  2. KVM :vnc 远程控制kvm创建虚拟机

    一.vnc远程控制服务器 前期准备: 1.编辑/etc/hosts vi /etc/hosts 10.1.16.32 kvm 2.关闭防火墙 service iptables stop 3.关闭sel ...

  3. motion做摄像头(ZC3XX)移动物体监控系列问题

    一:插入摄像头USB没有显示 gspca: video x creat 解决:cd /dev            ls |grep video 进入/dev目录下,运行ls |grep video命 ...

  4. MapReduce之提交job源码分析 FileInputFormat源码解析

    MapReduce之提交job源码分析 job 提交流程源码详解 //runner 类中提交job waitForCompletion() submit(); // 1 建立连接 connect(); ...

  5. python执行unittest界面设置

    执行单元测试时,系统会自动添加unittest in...的执行服务器. 执行时unittest in...的执行服务器在界面右上方可以看到,且执行结果为左侧框和右侧统计结果. 如果没有,会导致测试结 ...

  6. Java EE.JSP.脚本

    脚本是<%与%>之间Java语言编写的代码块. 1.输出表达式 <%=表达式%>输出表达式的计算结果. 2.注释 1)输出到客户端的注释:<!-comment-> ...

  7. Java--ASCII码

    ASCII(American Standard Code for Information Interchange,美国标准信息交换代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧 ...

  8. 在工作中常用到的SQL

    前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 最近在公司做了几张报表,还记得刚开始要做报表的时候都 ...

  9. WPF 动态添加按钮以及样式字典的引用(Style introduction)

    我们想要达到的结果是,绑定多个Checkbox然后我们还可以获取它是否被选中,其实很简单,我们只要找到那几个关键的对象就可以了. 下面是Ui,其中定义了一个WrapPanel来存放CheckBox,还 ...

  10. javaweb入门---web服务器与HTTP协议基础

    上文web基础简介了web到底是什么,以及身为Java开发人员需要掌握的地方.本文将解答web服务器是什么,怎么使用?还有关于http协议的基础知识. web服务器 web服务器的大概念很广泛,但是通 ...