昂贵的婚礼

POJ-1062

  • 这道题目一开始看的时候难以理解,但是仔细想,还是可以和最短路联系的,我觉得类似于硬币交换等问题。
  • 以下需要注意几个点,第一就是因为题目规定如何和超出了等级限制的人交易,则拒绝交易。也就是说符合交易条件的人一定和第一个人(国王)之间的等级差距小于m。
  • 这里通过枚举等级差距的方法来限制每次交易的人的总体的最大等级差距之差。加入一开始人的等级是3,而限制的等级差距是2,那么以下情况符合:1-3,2-4,3-5.也只有参加交易中的人的等级在这里面才能交易成功。
  • 所以,可以分别对这三种差距进行枚举,然后运行dijikstra算法,取最短的一个。
  • 还需要注意的是答案并不是直接求出来的最短路径。这里求解出来的知识优惠的价格而已,这里还要加上该结点的价格,也就是实际给钱的结点的价格才是最后答案。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<vector>
#include<queue>
using namespace std;
const int maxn=102;
const int INF=0X3F3F3F3F;
int m,n;
int price[maxn];
int level[maxn];
int map[maxn][maxn];//map[i][j]表示物品i,j之间可以交换时的优惠价
bool vis[maxn];
int d[maxn];
void dijikstra(int s){
memset(d,INF,sizeof(d));
d[s]=0;
for(int i=1;i<=n;i++){
int v=-1;
int mins=INF;
for(int j=1;j<=n;j++){
if(!vis[j]&&mins>d[j]){//
v=j;
mins=d[j];
}
}
if(v==-1)
break;
vis[v]=1;
for(int j=1;j<=n;j++){
if(!vis[j]&&d[j]>d[v]+map[v][j]){
d[j]=d[v]+map[v][j];
}
}
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
while(cin>>m>>n){
memset(map,INF,sizeof(map));
for(int i=1;i<=n;i++){
//int p,l,x;//物品的价格、主人的地位等级和替代品总数
int x;
cin>>price[i]>>level[i]>>x;
for(int j=0;j<x;j++){
int num,discount;
cin>>num>>discount;//替代品的编号和"优惠价格"
map[i][num]=discount;
}
}
int mins=INF;
for(int i=0;i<=m;i++){//这里枚举等级,将所有的情况枚举出来,就是符合这个的等级区间的不同情况
memset(vis,0,sizeof(vis));
for(int j=1;j<=n;j++){
if(level[1]-m+i>level[j]||level[1]+i<level[j]){//m表示等级限制
vis[j]=true;
}
}
dijikstra(1);
for(int j=1;j<=n;j++){//求出的最短路径还要加上直接交钱给该结点的价格,因为最短路是优惠的总价格。
mins=min(mins,price[j]+d[j]);
//cout<<d[j]<<endl;
}
}
cout<<mins<<endl;
}
return 0;
}

java:

package POJ;
import java.io.*;
import java.util.*;
public class POJ_1062 {
static final int maxn=102;
static final int INF=0X3F3F3F3F;
static int m,n;
static int []price;//[maxn];
static int []level;//[maxn];
static int [][]map;//[maxn][maxn];//map[i][j]表示物品i,j之间可以交换时的优惠价
static boolean []vis;//[maxn];
static int []d;//[maxn];
static void dijikstra(int s){
Arrays.fill(d, INF);
d[s]=0;
for(int i=1;i<=n;i++){
int v=-1;
int mins=INF;
for(int j=1;j<=n;j++){
if(!vis[j]&&mins>d[j]){//
v=j;
mins=d[j];
}
}
if(v==-1)
break;
vis[v]=true;
for(int j=1;j<=n;j++){
if(!vis[j]&&d[j]>d[v]+map[v][j]){
d[j]=d[v]+map[v][j];
}
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner cin=new Scanner(System.in);
while(cin.hasNext()){
m=cin.nextInt();
n=cin.nextInt();
map=new int[n+1][n+1];
price=new int[n+1];
level=new int[n+1];
vis=new boolean[n+1];
d=new int[n+1];
for(int i=0;i<=n;i++) {
for(int j=0;j<=n;j++) {
map[i][j]=INF;
}
}
for(int i=1;i<=n;i++){
//int p,l,x;//物品的价格、主人的地位等级和替代品总数
int x;
price[i]=cin.nextInt();
level[i]=cin.nextInt();
x=cin.nextInt(); for(int j=0;j<x;j++){
int num,discount;
num=cin.nextInt();
discount=cin.nextInt();//替代品的编号和"优惠价格"
map[i][num]=discount;
}
}
int mins=INF;
for(int i=0;i<=m;i++){//这里枚举等级,将所有的情况枚举出来,就是符合这个的等级区间的不同情况
Arrays.fill(vis, false);
for(int j=1;j<=n;j++){
if(level[1]-m+i>level[j]||level[1]+i<level[j]){//m表示等级限制
vis[j]=true;
}
}
dijikstra(1);
for(int j=1;j<=n;j++){//求出的最短路径还要加上直接交钱给该结点的价格,因为最短路是优惠的总价格。
mins=Math.min(mins,price[j]+d[j]);
//cout<<d[j]<<endl;
}
}
System.out.println(mins);
}
}
}

POJ-1062(原始dijiksra算法+思维)的更多相关文章

  1. 最短路(Dijkstra) POJ 1062 昂贵的聘礼

    题目传送门 /* 最短路:Dijkstra算法,首先依照等级差距枚举“删除”某些点,即used,然后分别从该点出发生成最短路 更新每个点的最短路的最小值 注意:国王的等级不一定是最高的:) */ #i ...

  2. POJ 1062 昂贵的聘礼

    C - 昂贵的聘礼 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit St ...

  3. POJ 1062 昂贵的聘礼(图论,最短路径)

    POJ 1062 昂贵的聘礼(图论,最短路径) Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女 ...

  4. 最短路POJ 1062 昂贵的聘礼

    C - 昂贵的聘礼 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit St ...

  5. [MIT6.006] 1. Algorithmic Thinking, Peak Finding 算法思维,峰值寻找

    [MIT6.006] 系列笔记将记录我观看<MIT6.006 Introduction to Algorithms, Fall 2011>的课程内容和一些自己补充扩展的知识点.该课程主要介 ...

  6. POJ 1062 昂贵的聘礼(枚举限制条件——Dijkstra算法)

    题目: 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长降低要求.酋长说:& ...

  7. poj 1062 昂贵的聘礼 (dijkstra最短路)

    题目链接:http://poj.org/problem?id=1062 昂贵的聘礼 Time Limit: 1000MS   Memory Limit: 10000K Total Submission ...

  8. POJ 1062 ( dijkstra )

    http://poj.org/problem?id=1062 一个中文题,一个多月之前我做过,当时我是用搜索写的,不过苦于卡在无法确定等级关系,所以就错了. 看了别人的博客后,我还是不是很理解所谓的枚 ...

  9. POJ 矩阵相乘 (随机化算法-舍伍德(Sherwood))

    周三的算法课,主要讲了随机化算法,介绍了拉斯维加斯算法,简单的理解了为什么要用随机化算法,随机化算法有什么好处. 在处理8皇后问题的时候,穷举法是最费时的,回朔比穷举好点,而当数据量比较大的时候,如1 ...

随机推荐

  1. Codeforces Round #602 Div2 D1. Optimal Subsequences (Easy Version)

    题意:给你一个数组a,询问m次,每次返回长度为k的和最大的子序列(要求字典序最小)的pos位置上的数字. 题解:和最大的子序列很简单,排个序就行,但是题目要求字典序最小,那我们在刚开始的时候先记录每个 ...

  2. POJ1087 A Plug for UNIX(网络流)

    在会议开始之前,你收集所有记者想要使用的设备,并尝试设置它们.你注意到有些设备使用没有插座的插头.你想知道这些设备是否来自建造这个房间时并不存在的国家.对于一些插座,有几个设备使用相应的插头.对于其他 ...

  3. kafka消息队列、环境搭建与使用(.net framework)

    一:kafka介绍 kafka(官网地址:http://kafka.apache.org)是一种高吞吐量的分布式发布订阅的消息队列系统,具有高性能和高吞吐率. 1.1 术语介绍 BrokerKafka ...

  4. 【POJ 1148】Utopia Divided

    Utopia Divided 题目链接:POJ 1148 题目大意 在一个坐标系中,一个点一开始在原点,然后被要求每次走到一个规定的象限内. 你有一些互不相同的数,每次你可以选每选过的两个,正负性可以 ...

  5. BIM轻量化——浏览器展示

    此篇博客仅为记录,记录钻研过程的零碎思路.         之前考虑过很多可能性,对rvt文件转换格式:.obj.JSON..gltf等等.这些可能性前人一般都尝试过,而且也都做出来了东西.     ...

  6. TCP 连接

    面试题传送 TCP 报文格式 此处介绍建立或者断开TCP连接时,需要了解的TCP报文段首部字段含义: 序列号 seq:占4个字节(32位),用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上 ...

  7. 缓冲区溢出实验 4 内存管理(类似于malloc free)

    实验环境.代码.及准备 https://www.cnblogs.com/lqerio/p/12870834.html vul4 观察foo函数,可见问题在于最后一次tfree(q).由于之前已经tfr ...

  8. Leetcode(17)-电话号码的字母组合

    给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母. 示例: 输入:"23" 输出:[&quo ...

  9. HDU 4649 Professor Tian(概率DP)题解

    题意:一个表达式,n + 1个数,n个操作,每个操作Oi和数Ai+1对应,给出每个操作Oi和数Ai+1消失的概率,给出最后表达式值得期望.只有| , ^,&三个位操作 思路:显然位操作只对当前 ...

  10. bash variables plus operator All In One

    bash variables plus operator All In One Errors missing pass params #!/usr/bin/env bash # echo emoji ...