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 ...
随机推荐
- 经典的css reset代码 (reset.css)
<style> html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, ...
- MAC 脚本批量启动应用
1.touch batchStart.sh 2. #!/bin/bash cd /xxx open 1.app open 2.app 3.chmod +x batchStart.sh 4.ok
- centos6安装nginx最详细步骤
第一步:在centos下面下载 nginx wget http://nginx.org/download/nginx-1.2.9.tar.gz 解压 tar zxf nginx-1. ...
- [闲来无事,从头再来][C51篇]导读
目 的: 通过学习C51,熟悉单片机,熟悉C语言,熟悉单片机系统的外部电路. 方 法: 通过看书和使用板子做实验来进行学习 参考资料: <新概念51单片机C语言教程& ...
- 还原sqlserver2008 r2 数据库步骤
1: 有备份文件bak 文件(是在sqlserver2008 r2上备份的) 数据库下载地址(讯雷) ed2k://|file|cn_sql_server_2008_r2_express_with_m ...
- jQuery实现复选框全选/所有取消/反选/获得选择的值
<!DOCTYPE html> <html> <head> <script type="text/javascript" src=&quo ...
- SAP 定价
近几天做门店团购销售订单上传SAP接口程序,SO创建测试过程中, 遇到定价问题,同事在定价过程的增强过不了. VOFM 了解到定价过程是个非常复杂的环节,此处出现程序处理过程中ZMP0定价条件下的价格 ...
- Linux基础系列:常用命令(8)_shell script
一.什么是shell script 将OS命令堆积到可执行的文件里,由上至下的顺序执行文本里的OS命令 就是脚本了. 再加上些智能(条件/流控)控制,就变成了智能化脚本了 二.变量命名规则 以字母或下 ...
- iOS UIImage 拉伸问题 (适用于UIButton等需要局部拉伸的情况)
图片 有的切图切很大 还占用ipa大小,有时候 切图 只需要 局部或者说 一个压缩的图片的抽象状态 直接上代码 CGFloat top = ; // 顶端盖高度 ; // 底端盖高度 ; // 左端盖 ...
- MySQL root 密码重置
安全模式重置法 基本的思路是,以安全模式启动mysql,这样不需要密码可以直接以root身份登录,然后重设密码. 1. 停止 MySQL 服务 [molo.wu@shark mysql (master ...