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个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长 ...
随机推荐
- jetty9 安装部署更改端口号
1.下载jetty 并解压到指定目录 2.更改默认端口号--在start.d中的http.ini中修改 3.启动服务 在jetty的根目录中输入命令 java -jar start.jar 服务就启 ...
- Android技术点
一.四大组件 1.1 Activity 1.2 Broadcast 1.3 Content Provider 1.4 Service 1. Binder 2. Messager 3. AIDL ...
- vb小菜一枚-----了解“类型推理”
局部类型推理 (Visual Basic) Visual Studio 2013 其他版本 Visual Basic 编译器使用类型推理来确定未使用 As 子句声明的局部变量的数据类型. 编译 ...
- hdoj 1022 Train Problem I
#include<stdio.h> int main() { int n,i,j,k; ],]; ]; while(scanf("%d %s %s",&n,in ...
- 【C++】自绘控件基础
由于我们对控件的功能.外观的需求,公共控件并不能很好地满足这一点,所以我们就得自绘控件. 自绘控件有许多方法,比如:处理WM_PAINT消息,设置ownDraw风格,处理WM_CTLCOLOR消息,等 ...
- html中使用js实现内容过长时部分
有时数据内容太长时我们并不希望其全部显示出来,因为这样可能会导致用于显示这些内容的标签被撑开影响美观. 这时就希望能够实现默认只显示部分内容,在鼠标放上去的时候再将全部的内容显示出来. 这里提供一个简 ...
- JavaScript调试工具
最常用的最有效的有三个: 1. FireFox浏览器的Firebug,我用得不多 2. IE 8浏览器的Microsoft Script Editor.当运行网页的脚本出错时,会报错,如下所示: 单击 ...
- iOS常用的忽略警告
在iOS开发过程中,偶尔会碰到一些编译器警告,如果能够确定该警告不会影响到程序的正常运行,则可以手动告诉编译器忽略掉这个警告 iOS常用的忽略警告类型: 1.方法弃用警告 #pragma clang ...
- EF(Linq)框架使用过程中的小技巧汇总
这篇博客总结本人在实际项目中遇到的一些关于EF或者Linq的问题,作为以后复习的笔记或者供后来人参考(遇到问题便更新). 目录 技巧1: DbFunctions.TruncateTime()的使用 技 ...
- 自己实现一个Native方法的调用
JNI 开始本篇的内容之前,首先要讲一下JNI.Java很好,使用的人很多.应用极广,但是Java不是完美的.Java的不足体现在运行速度要比传统的C++慢上许多之外,还有Java无法直接访问到操作系 ...