Poj1062 昂贵的聘礼 (dijkstra算法)
一、Description
为了方便起见,我们把所有的物品从1开始进行编号,酋长的允诺也看作一个物品,并且编号总是1。每个物品都有对应的价格P,主人的地位等级L,以及一系列的替代品Ti和该替代品所对应的"优惠"Vi。如果两人地位等级差距超过了M,就不能"间接交易"。你必须根据这些数据来计算出探险家最少需要多少金币才能娶到酋长的女儿。
Input
Output
二、题解
这题做了两天,又是一次痛苦的经历。在处理输入的时候花了点时间,然后想到用floyd计算节点对的最短路径来解决问题。很快完成了程序的编写,于是一步步用例子测试。几乎每个例子都能找到一个错误,比如对于全0的情况,只要输出酋长的价格就行了,还有就是没有注意只要和地位低的人交易后不能和地位高的交易,但是题目说他们认为这样等于是间接接触,反过来也一样。关于这点我还是认为有点歧义。结果我写的floyd算法在这点上就是过不去,于是该用迪杰斯特拉单元最短路径计算,并且每次选出一个人先算出看其他人是否能和他交易,如此进行M次,最后再找出最短路径。
三、java代码
import java.util.*;
public class Main { public static int[][] e;
public static int[] dis;
public static int[] used;
public static int[] level;
public static int n,m; public static void main(String[] args){
Scanner cin = new Scanner(System.in);
int x,t;
e = new int[101][101];
dis = new int[101];
used = new int[101];
level = new int[101];
m=cin.nextInt();
n=cin.nextInt();
for(int i=1;i<=n;i++){
e[0][i]=cin.nextInt();
level[i]=cin.nextInt();
x=cin.nextInt();
for(int j=0;j< x;j++){
t=cin.nextInt();
e[t][i]=cin.nextInt();
}
}
solve();
} public static void solve(){
int max,result;
result=e[0][1];
for(int i=1;i<=n;i++){
max=level[i];
for(int j=1;j<=n;j++){
if(level[j]>max || level[j]< max-m)
used[j]=1;
else
used[j]=0;
}
dijkstra();
if(result>dis[1])
result=dis[1];
}
System.out.println(result);
}
public static void dijkstra() {
int min,k;
for(int i=1;i<=n;i++){
dis[i]=e[0][i];
}
for(int i=1;i<=n;i++) {
min=Integer.MAX_VALUE;
k=0;
for(int j=1;j<=n;j++){
if(used[j]==0 && dis[j]< min){
min=dis[j];
k=j;
}
}
if(k==0)
break;
used[k]=1;
for(int j=1;j<=n;j++){
if(used[j]==0 && e[k][j]>0 && min+e[k][j]< dis[j]){
dis[j]=min+e[k][j];
}
}
}
}
}
floyd(),望高手指教。
import java.util.Scanner;
class Node{
int price;
int level;
public Node(int p,int l){
price=p;
level=l;
}
}
public class Main {
static int size;
static int m;
static int[][] map;
static Node[] node;
static int[] re;
static boolean visit[];
static int INF=Integer.MAX_VALUE;
public static void floyd(){
int i=1,j,k;
for(k=1;k<=size;k++){
for(j=1;j<=size;j++){
if(i!=j && map[i][k]!=INF && map[k][j]!=INF && map[i][k] + map[k][j] < map[i][j]){
re[j]=map[i][k] + map[k][j];
map[i][j] = map[i][k] + map[k][j];
visit[j]=true;
}
}
}
}
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int i,j,k,t1,t2;
m=sc.nextInt();
size=sc.nextInt();
map=new int[size+1][size+1];
node=new Node[size+1];
visit=new boolean[size+1];
for(i=0;i<=size;i++){
for(j=0;j<=size;j++){
map[i][j]= (i==j)? 0:INF;
}
}
for(i=1;i<=size;i++){
node[i]=new Node(sc.nextInt(),sc.nextInt());
k=sc.nextInt();
for(j=0;j<k;j++){
t1=sc.nextInt();
t2=sc.nextInt();
map[i][t1]=t2;
}
}
for(i=1;i<=size;i++){
for(j=1;j<=size;j++){
if(i!=j && map[i][j]!=INF&& Math.abs(node[i].level-node[j].level)>m){
map[i][j]=INF;
}
}
}
floyd();
for(i=2;i<=size;i++){
if( map[1][i]!=INF)
map[1][i]+=node[i].price;
}
int min=INF;
for(i=1;i<=size;i++){
if(map[1][i]<min)
min=map[1][i];
}
System.out.println(min);
}
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
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昂贵的聘礼(Dijkstra**)
/* 题意: 物主有一个物品,价值为P,地位为L, 以及一系列的替代品Ti和该替代品所对应的"优惠"Vi g[u][i] 表示的是u物品被i物品替换后的优惠价格!(u>0, ...
- [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,直接做,MLE了. 本体应该用最短路径(Dijkstra算法)做. 此题的关键在于等级限制的处理,采用枚举,即假设酋长等级为5,等级限制为2,那么需要枚举等 ...
- POJ1062 昂贵的聘礼 【DFS】
昂贵的聘礼 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 37475 Accepted: 10816 Descripti ...
随机推荐
- 软RAID5制作流程
说明:本实验没有用到多个磁盘,而是利用单个磁盘划分出的多个分区来仿真的,如果在实际项目中,请依情况而定. 1. 分区 我这里划分6个分区,用4个分区组成RAID 5,用1个分区作为spare disk ...
- C++学习笔记30,指针的引用(2)
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/guang_jing/article/details/32910093 能够创建不论什么类型的引用,包 ...
- linux 中 用户管理 (composer 时不能root 遇到)
linux 是支持多用户的,可以同时多个用户在线操作,这点与 Windows 不同. 在我们项目组 操作linux 服务器时,可进行多用户管理,并赋予不同权限,下面是我学习并用的比较频繁的命令: 1. ...
- zabbix监控入门初步
1.Zabbix是什么? Zabbix是一个基于Web界面的分布式系统监控的企业级开源软件.可以监视各种系统与设备的参数,保障服务器及设备的安全运营. 2.Zabbix的功能和特性 (1)安装与配置简 ...
- 3.30课·········Marquee标签
页面的自动滚动效果,可由javascript来实现, 但是有一个html标签 - <marquee></marquee>可以实现多种滚动效果,无需js控制. 使用marquee ...
- 用Java实现断点续传的基本思路和代码
用Java实现断点续传的基本思路和代码 URL url = new URL(http://www.oschina.net/no-exist.zip); HttpURLConnection http ...
- Effective java -- 6 方法
第三十八条:检查参数的有效性 第三十九条:必要时进行保护性拷贝 public class Period { private final Date start; private final Date e ...
- curl常用指令
curl 发送GET请求获取标准输出 curl -I 显示http请求头 curl -i 显示请求头及输出内容 curl xxx > xxx 将输出重定向到本地文件(本地文件无需已存在,一般不写 ...
- apache中配置php支持模块模式、cgi模式和fastcgi模式的实验
首先安装apache.mysql和php,依次顺序安装. 1.apache.mysql的安装比较简单,略过 2. php的安装,我安装的是php5.3.6内置了php-fpm,所以不需要再单独下补丁了 ...
- ScreenOS学习笔记
安全区段 第2层 V1-Trust 同一区段内的接口通信不需要策略,不同区段之间的接口通信则需要策略. Global区段没有接口 V1-Untrust V1-DMZ 第3层 Trust Untrust ...