poj1062昂贵的聘礼(Dijkstra**)
/*
题意: 物主有一个物品,价值为P,地位为L, 以及一系列的替代品Ti和该替代品所对应的"优惠"Vi
g[u][i] 表示的是u物品被i物品替换后的优惠价格!(u>0, i>0)
g[u][0]表示不用替换该物品的实际价格 !
d[0]表示的是第一个物品经过一系列的物品替换之后的最少优惠价格! 思路:每当我们通过Dijkstra算法得到离源点(1)最近的距离的节点 p的时候(也就是1...pre[p], p)这条
路径上的物品互相替换后得到最优价格,我们需要判断是否满足路径上的任意两个节点的地位差的绝对值是否
<=m, 如果不是,那么这条路经就废掉了!要从新找最短路!
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define INF 0x3f3f3f3f
using namespace std; int g[][]; int d[];
int L[];
int vis[];
int pre[];
int m, n;
int minP, maxP; bool dfs(int p){
if(p==) return true;
if(abs(minP-L[pre[p]])>m || abs(maxP-L[pre[p]])>m){
g[pre[p]][p]=INF;//这条路径往回走的过程中,如果发现某两个节点的地位差的绝对值>m, 这一条边无效!
return false; //注意:不要改变其他路径的存在情况!
}
if(minP>L[pre[p]]) minP=L[pre[p]];
if(maxP<L[pre[p]]) maxP=L[pre[p]];
return dfs(pre[p]);
} void Dijkstra(){
memset(d, 0x3f, sizeof(d));
memset(vis, , sizeof(vis));
d[]=;
vis[]=;
int root=;
int minLen, p; for(int j=; j<=n; ++j){
minLen=INF;
for(int i=; i<=n; ++i){
if(g[root][i]){
if(!vis[i] && d[i]>d[root]+g[root][i]){
d[i]=d[root]+g[root][i];
pre[i]=root;
}
if(!vis[i] && minLen>d[i]){
minLen=d[i];
p=i;
}
}
}
minP=maxP=L[p];
if(p && !dfs(p)){//从路径的地步往上走,看一下时候满足条件
while(p!=){
d[p]=INF;
p=pre[p];
}
j=;//从头开始寻找其他的路径!
root=;
memset(vis, , sizeof(vis));
vis[root]=;
continue;
}
root=p;
vis[root]=;
}
} int main(){
while(scanf("%d%d", &m, &n)!=EOF){
memset(g, 0x3f, sizeof(g));
for(int i=; i<=n; ++i){
int p, x;
scanf("%d%d%d", &p, &L[i], &x);
g[i][]=p;
while(x--){
int v, w;
scanf("%d%d", &v, &w);
g[i][v]=w;
}
}
Dijkstra();
printf("%d\n", d[]);
}
return ;
}
poj1062昂贵的聘礼(Dijkstra**)的更多相关文章
- POJ-1062 昂贵的聘礼---Dijkstra+枚举上界
题目链接: https://vjudge.net/problem/POJ-1062 题目大意: 中文题 思路: 1是终点,可以额外添加一个源点0,0到任意一节点的距离就是这个点的money,最终求的是 ...
- POJ-1062 昂贵的聘礼 (最短路)
POJ-1062 昂贵的聘礼:http://poj.org/problem?id=1062 题意: 有一个人要到1号点花费最少的钱,他可以花费一号点对应的价格,也可以先买下其他一些点,使得费用降低. ...
- POJ1062昂贵的聘礼(dijkstra)
昂贵的聘礼 题目大意是说有N个物品,每个物品都有自己的价格,但同时某些物品也可以由其他的(可能不止一个)替代品,这些替代品的价格比较“优惠”,问怎么样选取可以让你的花费最少来购买到物品1 由于有N个物 ...
- POJ1062昂贵的聘礼(经典) 枚举区间 +【Dijkstra】
<题目链接> 昂贵的聘礼 Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用1000 ...
- [poj1062]昂贵的聘礼_最短路_离散化
昂贵的聘礼 poj-1062 题目大意:原文链接?不是英文题,自己看 注释:$1\le N \le 100$. 想法:开始的想法有些过于简单,因为落下了一个条件:就是等级限制是一条路径上的任意两点而不 ...
- POJ1062昂贵的聘礼[最短路建模]
昂贵的聘礼 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 45892 Accepted: 13614 Descripti ...
- 昂贵的聘礼(dijkstra)
昂贵的聘礼 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 38549 Accepted: 11158 Descripti ...
- POJ1062 昂贵的聘礼 【DFS】
昂贵的聘礼 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 37475 Accepted: 10816 Descripti ...
- Poj1062 昂贵的聘礼 (dijkstra算法)
一.Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长 ...
随机推荐
- oracle入门必备
//................创建表空间 \ 赋予角色 \ 创建数据表 \ 插入数据 \ 创建序列 \ 添加注释 ........................... --创 ...
- oracle中imp命令详解 .
转自http://www.cnblogs.com/songdavid/articles/2435439.html oracle中imp命令详解 Oracle的导入实用程序(Import utility ...
- 第53讲:Scala中结构类型实战详解
今天学习了scala的结构类型,让我们看看代码 class Structural {def open() = print("A class interface opened") } ...
- Linq To Xml基础
<?xml version="1.0" encoding="utf-8" ?> <Books> <Category Order=& ...
- C#常用代码集合(1)
引用自james li的博客,地址:http://www.cnblogs.com/JamesLi2015/p/3147986.html 1 读取操作系统和CLR的版本 OperatingSys ...
- Python 深入理解yield
只是粗略的知道yield可以用来为一个函数返回值塞数据,比如下面的例子: for 取出alist的每一项,然后把i + 1塞进去.然后通过调用取出每一项: = [1, 2, 3, 4]for x in ...
- Linux + Mono 目前已经支持Entity Framework 6.1
在上个随笔 CentOS上 Mono3.2.8运行ASP.NET MVC4经验中,步骤2中要求卸载EF 5.0,这样才能在Linux + Mono的环境中运行ASP.NET MVC4的Web应用.今天 ...
- angularjs http 请求拦截器
/** * Created by oy on 2016/11/29. */ (function() { 'use strict'; // 创建angular模块 angular .module('ap ...
- CentOs笔记
系统 CentOs7,最小安装,使用 Ext4,/ ,/boot,/swap 使用标准分区,另一个分区做为数据分区,使用 LVM. 更新: http://mirrors.163.com/.help/c ...
- Demystifying ASP.NET MVC 5 Error Pages and Error Logging
出处:http://dusted.codes/demystifying-aspnet-mvc-5-error-pages-and-error-logging Error pages and error ...