POJ 1062 昂贵的聘礼 最短路+超级源点
Description
为了方便起见,我们把所有的物品从1开始进行编号,酋长的允诺也看作一个物品,并且编号总是1。每个物品都有对应的价格P,主人的地位等级L,以及一系列的替代品Ti和该替代品所对应的"优惠"Vi。如果两人地位等级差距超过了M,就不能"间接交易"。你必须根据这些数据来计算出探险家最少需要多少金币才能娶到酋长的女儿。
Input
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
分析
输出最小的金币数,这道题首先想到的就是建图跑最小路,我最开始用的方法是根据所给信息把边权和点权都加上,然后在跑Dij的时候判断
如果选择边权,那么还要加和这个点的儿子的权,如果选择点权就不用,然后统计到各个点最小距离。
打了一下样例没过,然后回去想,发现加的是双向边,于是又加了一个vis数组判断是否访问过,这次样例过了,交上去WA
再仔细想一下,先不管我的点权和边权处理有没有问题,就一个问题是很难解决的,就是终点是什么,不一定所有的点都能当做本次统计的终点
也就是说它会直接返回最小值,不管这个最小值是不是已经把所有需要的点权边权都包括进去了,比如我要买二号物品来降低一号物品价格,在统计
到二号物品的路程时,直接返回了边权,但点权也是应该加上的,所以没有选完全 我感觉还是我的程序有问题
重新思考,有没有一种方法能够让程序自动判断选择边权还是点权,并且终点是一样的?
受如果使用该物品的话边权和点权必选其一的启发,我们可以采用超级源点,即把所有的点的点权作为这个点和超级源点的边权,于是又跑一遍
又没过样例,这次我发现一个问题,我加的是双向边,而加双向边是肯定不行的,因为边权表示买二号物品得到三号物品的优惠,如果加双向的话就
表明买三号物品也能得到二号物品的优惠,这显然是不对的,于是我们考虑边的方向,从源点出来,边的去向一定是指向每个点,因为我们是以源点
为起点,一号物品为终点跑的Dij,所以输入时,如果买a对b有优惠,那么Add_Edge(a->b),这样就可以保证终点是一样的,且最短路径上每个点的
点权或边权都被选完全了。
修改完代码,测了测样例,对了!然后交上去,WA。。。。
接着我思考半天后找到了我最开始过深考虑的问题——等级,我起初是怎么处理的呢?我在建图时判断,如果一个点的等级与第一物品的差值的
绝对值小于m,就不加这个点及其周围的边。这么看好像是对的,举个例子,m=3,level[1]=8,我们买了level[2]=6,level[3]=10的两个物品,由题意,
这不被允许,所以不能这么判断,但这给了我一个启发:买的物品价值范围(levelmax-levelmin<=m),所以我们可以考虑枚举物品的价值范围,每次
对于枚举的范围进行Dij求最短路,输出最短的路径即可。
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
const int N=,INF=0x3f3f3f3f;
struct Edge{
int to,next,val;
}e[N*N];
struct Node{
int id,val;
Node(){};
Node(int a,int b){id=a;val=b;}
bool operator < (const Node&A)const {
return val>A.val;
}
};
int Head[N],len,lev[N],ans,m,n,dis[N];
void Ins(int a,int b,int c){
e[++len].to=b;e[len].val=c;
e[len].next=Head[a];Head[a]=len;
}
void dij(int level){
priority_queue<Node> q;
memset(dis,0x3f,sizeof(dis));
dis[]=;
q.push(Node(,dis[]));
while(!q.empty()){
Node u=q.top();q.pop();
for(int x=Head[u.id];x;x=e[x].next){
int v=e[x].to;
if(lev[v]-level>m||lev[v]<level)continue;
if(dis[v]>dis[u.id]+e[x].val){
dis[v]=dis[u.id]+e[x].val;
q.push(Node(v,dis[v]));
}
}
}
ans=min(ans,dis[]);
}
int main(){
// freopen("a.txt","r",stdin);
int selfval;
ans=INF;
scanf("%d%d",&m,&n);
for(int i=;i<=n;i++){
int c;
scanf("%d%d%d",&selfval,&lev[i],&c);
Ins(,i,selfval);
for(int j=;j<=c;j++){
int a,b;
scanf("%d%d",&a,&b);
Ins(a,i,b);
}
}
for(int i=lev[]-m;i<=lev[];i++)
dij(i);
printf("%d\n",ans);
}
Code
这个问题看起来还是比较难的,但是想明白以后也比较简单,下次在做题的时候一定把问题先想清楚,边做边想太难了。。。。。。
POJ 1062 昂贵的聘礼 最短路+超级源点的更多相关文章
- POJ - 1062 昂贵的聘礼(最短路Dijkstra)
昂贵的聘礼 Time Limit: 1000MS Memory Limit: 10000KB 64bit IO Format: %I64d & %I64u SubmitStatus Descr ...
- POJ 1062 昂贵的聘礼 最短路 难度:0
http://poj.org/problem?id=1062 #include <iostream> #include <cstring> #include <queue ...
- poj 1062 昂贵的聘礼 最短路 dijkstra
#include <cstdio> #include <cmath> #include <cstring> #include <ctime> #incl ...
- 最短路(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 昂贵的聘礼 (最短路)
昂贵的聘礼 题目链接: http://acm.hust.edu.cn/vjudge/contest/122685#problem/M Description 年轻的探险家来到了一个印第安部落里.在那里 ...
- POJ 1062 昂贵的聘礼 【带限制的最短路/建模】
年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长降低要求.酋长说:" ...
随机推荐
- 4——PHP比较&&复制运算符
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- python列表解析补充:
python列表解析补充: # 补充: f = [x + y for x in 'ABCDE' for y in '1234567'] print(f) test = [] for x in 'ABC ...
- javascript常用工具函数总结(不定期补充)未指定标题的文章
前言 以下代码来自:自己写的.工作项目框架上用到的.其他框架源码上的.网上看到的. 主要是作为工具函数,服务于框架业务,自身不依赖于其他框架类库,部分使用到es6/es7的语法使用时要注意转码 虽然尽 ...
- 《即时消息技术剖析与实战》学习笔记11——IM系统如何保证服务高可用:流量控制和熔断机制
IM 系统的不可用主要有以下两个原因: 一是无法预测突发流量,即使进行了服务拆分.自动扩容,但流量增长过快时,服务已经不可用了: 二是业务中依赖的这些接口.资源不可用或变慢时,比如发消息可能需要依赖& ...
- LeetCode37 使用回溯算法实现解数独,详解剪枝优化
本文始发于个人公众号:TechFlow,原创不易,求个关注 数独是一个老少咸宜的益智游戏,一直有很多拥趸.但是有没有想过,数独游戏是怎么创造出来的呢?当然我们可以每一关都人工设置,但是显然这工作量非常 ...
- 分享一个快速审查js操作Dom的css
第一步 打开开发者工具第二步 打开 Sources 面板第三步 执行用户操作让对象可见(例如鼠标悬停)第四步 在元素可见的时候按下 F8(与“暂停脚本执行”按钮相同)第五步 点击开发者工具左上角的“选 ...
- VUE四 axios详解
axios的中文文档写的已经很详细 https://www.kancloud.cn/yunye/axios/234845
- DOM是什么(初级版)
js新手村出村之路--基础知识 在这里默认你已经粗粗的自学过了一遍js知识.(也许是在昏昏欲睡的课堂上听了两分钟,也许是跟着b站上的视频打了一遍.who cares) 在下面的内容中我将整理一些在平常 ...
- 内网渗透之权限维持 - MSF与cs联动
年初六 六六六 MSF和cs联动 msf连接cs 1.在队伍服务器上启动cs服务端 ./teamserver 团队服务器ip 连接密码 2.cs客户端连接攻击机 填团队服务器ip和密码,名字随便 ms ...
- Logitech k480 蓝牙键盘连接 ubuntu 系统
k480 能同时连接三台蓝牙设备,支持 Windows.Android.Chrome.Mac OS X 和 iOS 系统.奈何官方并不支持 Ubuntu. 有压迫就有反抗,呃...,不对,总是有办法在 ...