【POJ - 1062】【nyoj - 510】昂贵的聘礼 (Dijkstra最短路+思维)

题干:

年轻的探险家来到了一个印第安部落里。在那里他和酋长的女儿相爱了,于是便向酋长去求亲。酋长要他用10000个金币作为聘礼才答应把女儿嫁给他。探险家拿不出这么多金币,便请求酋长降低要求。酋长说:"嗯,如果你能够替我弄到大祭司的皮袄,我可以只要8000金币。如果你能够弄来他的水晶球,那么只要5000金币就行了。"探险家就跑到大祭司那里,向他要求皮袄或水晶球,大祭司要他用金币来换,或者替他弄来其他的东西,他可以降低价格。探险家于是又跑到其他地方,其他人也提出了类似的要求,或者直接用金币换,或者找到其他东西就可以降低价格。不过探险家没必要用多样东西去换一样东西,因为不会得到更低的价格。探险家现在很需要你的帮忙,让他用最少的金币娶到自己的心上人。另外他要告诉你的是,在这个部落里,等级观念十分森严。地位差距超过一定限制的两个人之间不会进行任何形式的直接接触,包括交易。他是一个外来人,所以可以不受这些限制。但是如果他和某个地位较低的人进行了交易,地位较高的的人不会再和他交易,他们认为这样等于是间接接触,反过来也一样。因此你需要在考虑所有的情况以后给他提供一个最好的方案。 
为了方便起见,我们把所有的物品从1开始进行编号,酋长的允诺也看作一个物品,并且编号总是1。每个物品都有对应的价格P,主人的地位等级L,以及一系列的替代品Ti和该替代品所对应的"优惠"Vi。如果两人地位等级差距超过了M,就不能"间接交易"。你必须根据这些数据来计算出探险家最少需要多少金币才能娶到酋长的女儿。 

Input

输入第一行是两个整数M,N(1 <= N <= 100),依次表示地位等级差距限制和物品的总数。接下来按照编号从小到大依次给出了N个物品的描述。每个物品的描述开头是三个非负整数P、L、X(X < N),依次表示该物品的价格、主人的地位等级和替代品总数。接下来X行每行包括两个整数T和V,分别表示替代品的编号和"优惠价格"。

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

解题报告:

        从1开始跑,多次跑最短路。

AC代码:(这不是最优的板子。。。板子里没有dis[minv] = minw;这句)

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm> 
using namespace std;
const int INF = 0x3f3f3f3f;
int maze[110][110];
int val[110],dis[110],rank[110];
bool vis[110];
bool ok[110];
int n;
int Dijkstra() {memset(vis,0,sizeof(vis));memset(dis,INF,sizeof(dis));dis[1] = 0;int all = n;int minw,minv;while(all--) {minw = INF;for(int i = 1; i<=n; i++) {if(!vis[i] && dis[i] < minw &&ok[i]) {minv = i;minw = dis[i];}}if(minw == INF) break;//这里不一样!!! vis[minv] = 1;dis[minv] = minw;//emmm板子里没有 后面这句for(int i = 1; i<=n; i++) {if(!vis[i] && dis[i] > dis[minv] + maze[minv][i] &&ok[i]) {dis[i] = dis[minv] + maze[minv][i];}}}int minn =INF;for(int i = 1; i<=n; i++) {if(dis[i] + val[i] < minn && vis[i]) {minn = dis[i] + val[i];}}return minn;
}int main()
{int limit,i,j,k,t;scanf("%d%d",&limit,&n);memset(dis,INF,sizeof(dis));memset(maze,INF,sizeof(maze));//就不初始化 //其实这个题是可以初始化0的 for ( i = 1; i <= n; i++ )maze[i][i] = 0;for(int i = 1; i<=n; i++) {scanf("%d",&val[i]);//val[i]一般代表点的价值,dis[i]一般代表出发点到该点的距离和 scanf("%d",&rank[i]);scanf("%d",&t);while(t--) {scanf("%d",&k);scanf("%d",&maze[i][k]);}}int ans = INF;for(int i = 0; i<=limit; i++) {memset(ok,0,sizeof(ok));for(int j = 1; j<=n; j++) {if(rank[j] >= rank[1]-(limit-i) && rank[j] <= rank[1]+i) ok[j] = 1;}ans = min(ans,Dijkstra());}printf("%d\n",ans);return 0 ;
}

但是其中的Dijkstra函数:

int Dijkstra() {memset(vis,0,sizeof(vis));memset(dis,INF,sizeof(dis));dis[1] = 0;int all = n;int minw,minv;while(all--) {minw = INF;for(int i = 1; i<=n; i++) {if(!vis[i] && dis[i] < minw &&ok[i]) {minv = i;minw = dis[i];}}
//		if(minw == INF) break;//这里不一样!!! vis[minv] = 1;dis[minv] = minw;for(int i = 1; i<=n; i++) {if(!vis[i] && dis[i] > dis[minv] + maze[minv][i] &&ok[i]) {dis[i] = dis[minv] + maze[minv][i];}}}int minn =INF;for(int i = 1; i<=n; i++) {if(dis[i] + val[i] < minn && ok[i]) {minn = dis[i] + val[i];}}return minn;
}

 这样写就wa,,不知道为啥。俩代码一共就两个地方不一样。


我知道为什么wa了。你需要把这句删掉,,板子里没有这句。

总结:

  1.以后还是把vis和dis的初始化放在DIjkstra里面吧,省的多次调用DIjkstra的时候忘了初始化。

  2.一般用val[i]一般代表点的价值,dis[i]一般代表出发点到该点的距离和 。

  3. 以后还是用邻接表存图吧,,maze初始化这地方有的时候是个坑,maze[i][i]这种情况是赋值0还是INF?

最后附一个dfs版本的:(https://blog.csdn.net/qq276291420/article/details/9470335)

#include<stdio.h>
#include<string.h>
int map[105][105];
int price[105];
int level[105];
int dis[105];
int n, m;
int flag[105];
int min;
int max_level, min_level;
void dfs(int pos)
{int i;int temp_max, temp_min;for(i = 2; i <= n; i++){if(map[pos][i] != -1 && flag[i] == 0){if(dis[pos] + map[pos][i] <= min){if(level[i] <= max_level && level[i] >= min_level){temp_max = max_level;temp_min = min_level;max_level = level[i] + m > max_level ? max_level : level[i] + m;min_level = level[i] - m > min_level ? level[i] - m : min_level;dis[i] = dis[pos] + map[pos][i];flag[i] = 1;dfs(i);flag[i] = 0;max_level = temp_max;min_level = temp_min;}}}}if(min > dis[pos] + price[pos])min = dis[pos] + price[pos];
}
int main()
{
//	freopen("test.txt", "r", stdin);while(scanf("%d %d", &m, &n), m + n != 0){	int p, l , x, t, v;	int i, j;memset(map, -1, sizeof(map));memset(dis, 0, sizeof(dis));for(i = 1; i <= n; i++){scanf("%d %d %d", &p, &l, &x);level[i] = l;price[i] = p;for(j = 1; j <= x; j++){scanf("%d %d", &t, &v);map[i][t] = v;}}max_level = level[1] + m;min_level = level[1] - m;flag[1] = 1;min = price[1];dfs(1);printf("%d\n", min);}return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/441931.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【HDU - 5605】 geometry(水,数学题,推公式)

题干&#xff1a; There is a point PP at coordinate (x,y)(x,y). A line goes through the point, and intersects with the postive part of X,YX,Yaxes at point A,BA,B. Please calculate the minimum possible value of |PA|∗|PB||PA|∗|PB|. Input the first line…

matlab如何画函数的外包络曲线,怎样在MATLAB中划出一个函数的包络线?

沧海一幻觉下面是一系列关于MATLAB的包络线的程序&#xff1a;%这是定义了一个函数&#xff1a;function [up,down] envelope(x,y,interpMethod)%ENVELOPE gets the data of upper and down envelope of the known input (x,y).%% Input parameters:% x the abscissa of the g…

【51Nod - 1279】 扔盘子(思维)(on-p会超时)

题干&#xff1a; 有一口井&#xff0c;井的高度为N&#xff0c;每隔1个单位它的宽度有变化。现在从井口往下面扔圆盘&#xff0c;如果圆盘的宽度大于井在某个高度的宽度&#xff0c;则圆盘被卡住&#xff08;恰好等于的话会下去&#xff09;。 盘子有几种命运&#xff1a;1、…

java 内部类私有成员 能访问,为什么外部Java类可以访问内部类私有成员?

HUX布斯如果您想隐藏内部类的私有成员&#xff0c;您可以与公共成员定义一个接口&#xff0c;并创建一个实现此接口的匿名内部类。下面的例子&#xff1a;class ABC{private interface MyInterface{void printInt();}private static MyInterface mMember new MyInterface(){pr…

【POJ - 3321】 Apple Tree(dfs序 + 线段树维护 或 dfs序 + 树状数组维护)

题干&#xff1a; There is an apple tree outside of kakas house. Every autumn, a lot of apples will grow in the tree. Kaka likes apple very much, so he has been carefully nurturing the big apple tree. The tree has N forks which are connected by branches. …

【HDU - 1698】 Just a Hook(线段树模板 区间覆盖更新(laz标记) + 区间和查询 )

题干&#xff1a; In the game of DotA, Pudge’s meat hook is actually the most horrible thing for most of the heroes. The hook is made up of several consecutive metallic sticks which are of the same length. Now Pudge wants to do some operations on the hoo…

反序列化 php R类型,pikachu-PHP反序列化、XXE、SSFR

一、PHP反序列化1.1概述在理解这个漏洞前,你需要先搞清楚php中serialize()&#xff0c;unserialize()这两个函数。序列化serialize()序列化说通俗点就是把一个对象变成可以传输的字符串,比如下面是一个对象:class S{public $test"pikachu";}$snew S(); //创建一个对象…

【51nod - 前缀异或】 对前缀和的理解

题干&#xff1a; 前缀异或 基准时间限制&#xff1a;2 秒 空间限制&#xff1a;131072 KB 分值: 5 输入一个长度为n(1 < n < 100000)数组a[1], a[2], ..., a[n]。 输入一个询问数m(1 < m < 100000)和m组询问&#xff0c;每组询问形如(l, r) 对于每组询问(l, …

oracle中创建实体,生成实体-SqlSugar 4.x-文档园

注意&#xff1a;使用DbFirst数据库账户要有系统表的权限,否则无法读取表的结构1.将库里面所有表都生成实体类文件db.DbFirst.CreateClassFile("c:\\Demo\\1",命名空间);2.指定名表生成 &#xff0c;可以传数组db.DbFirst.Where("Student").CreateClassFil…

【HDU - 1087】Super Jumping! Jumping! Jumping! (最大上升子序列类问题,dp)

题干&#xff1a; Nowadays, a kind of chess game called “Super Jumping! Jumping! Jumping!” is very popular in HDU. Maybe you are a good boy, and know little about this game, so I introduce it to you now. The game can be played by two or more than two pl…

oracle启动监听读取哪个文件,监听服务启动及数据文件恢复oracle数据库

最近遭遇了 oralce 监听服务启动了 又自行关闭的 悲惨经历我把我的过程和大家分享一下&#xff01;1)排查原因程序员是懒惰的&#xff0c;我始终都希望能够成功启动监听服务&#xff0c;但是就是事与愿违有一下方式可能不能成功启动监听1.端口占用&#xff0c;oralce 要用到152…

【HDU - 2571】 命运(记忆化搜索)

题干&#xff1a; 穿过幽谷意味着离大魔王lemon已经无限接近了&#xff01; 可谁能想到&#xff0c;yifenfei在斩杀了一些虾兵蟹将后&#xff0c;却再次面临命运大迷宫的考验&#xff0c;这是魔王lemon设下的又一个机关。要知道&#xff0c;不论何人&#xff0c;若在迷宫中被…

nmon监控linux内存,使用Nmon监控Linux系统性能

Nmon (又称 Nigel’s Monitor) 是一款常用的系统性能监视工具&#xff0c;由 IBM 工程师 Nigel Griffiths 开发&#xff0c;适用于 AIX 和 Linux 操作系统。该工具可以直接在屏幕上显示当前操作系统的资源利用率&#xff0c;以帮助大家找出系统瓶颈和协助系统调优。由于其十分出…

linux mysql授权远程登录,Linux中 MySQL 授权远程连接的方法步骤

说明&#xff1a;当别的机子(IP )通过客户端的方式在没有授权的情况下是无法连接 MySQL 数据库的&#xff0c;如果需要远程连接 Linux 系统上的 MySQL 时&#xff0c;必须为其 IP 和 具体用户 进行 授权 。一般 root 用户不会提供给开发者。如&#xff1a;使用 Windows 上的 SQ…

linux 双通道 磁盘,HP MSA2012SA 双通道 磁盘阵列配置说明 for linuxoracle

HP MSA2012SA磁盘阵列配置说明说明&#xff1a;可以先安装HP服务器的操作系统&#xff0c;等安装完了以后再配置磁阵&#xff1b;1、安装好服务器的操作系统&#xff1b;该安装的包都安装上&#xff1b;2、磁盘阵列上架&#xff0c;加电&#xff0c;SAS线不用接服务器&#xff…

linux mariadb 乱码,MariaDB插入中文数据乱码解决过程

基本情况&#xff1a;MariaDB安装方式&#xff1a;yum乱码解决过程&#xff1a;1.查看当前数据库编码(登录数据库后)# show variables like character%;(上图为已经配置成功)2.如果结果不为上图则需要设置数据库配置文件•编辑 /etc/my.cnf.d/client.cnf 文件&#xff0c;添加如…

摩托罗拉为什么要限制自家linux手机,摩托罗拉为何在安卓手机大放异彩的时候,突然开始衰败了呢?...

摩托罗拉从一开始就走在了安卓的道路上&#xff0c;并且魅力四射&#xff0c;可以说一时间也是风光无比。对比诺基亚坚定的走向WP之路&#xff0c;这一点摩托罗拉没有走错。安卓当时的热门机中&#xff0c;摩托罗拉的里程碑系列可以算作是经典之作。销量也可以进入当年的前三。…

pta输出三角形字符阵列c语言,C语言l|博客园作业11

这个作业属于哪个课程C语言程序设计II这个作业要求在哪里链接我在这个课程的目标是掌握C语言以及熟练运用这个作业在哪个具体方面帮助我实现目标询问同学&#xff0c;百度&#xff0c;vs2019上的报错参考文献链接1.1 题目名6-1 统计某类完全平方数本题要求实现一个函数&#xf…

*由易到难的讲解动态规划(精)

简介(入门) 什么是动态规划&#xff0c;我们要如何描述它? 动态规划算法通常基于一个递推公式及一个或多个初始状态。 当前子问题的解将由上一次子问题的解推出。使用动态规划来解题只需要多项式时间复杂度&#xff0c; 因此它比回溯法、暴力法等要快许多。 现在让我们通过一…

计划的主体部分应有哪些内容_本科论文查重查哪些部分内容?需要注意什么?...

作者&#xff1a;新风学术网关于本科毕业论文查重是查重哪些首先我们需要了解的是查重的依据&#xff0c;论文查重是建立在论文上的&#xff0c;我们先要知道一篇论文有哪些地方能用来检测&#xff0c;一篇论文它的组成是由封面、目录、前言、正文、参考文献、附录、页眉页脚等…