昂贵的婚礼

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. hdu1313 Round and Round We Go (大数乘法)

    Problem Description A cyclic number is an integer n digits in length which, when multiplied by any i ...

  2. JDK的卸载与安装

    JDK的卸载 删除Java的安装目录 删除JAVA_HOME 删除path下关于Java的目录 DOS命令Java -version查看状态 JDK的安装 百度搜索jdk8,找到下载地址 同意协议 下 ...

  3. [Golang]-4 错误处理、Panic、Defer

    目录 错误和异常 案例 Panic Defer 使用 defer+recover 来处理错误 参考文章: Go 语言使用一个独立的·明确的返回值来传递错误信息的.这与使用异常的 Java 和 Ruby ...

  4. ArcGIS处理栅格数据(一)

    一.建立影像金字塔 ArcToolbox--数据管理工具--栅格--栅格属性--构建金字塔(pyramid) 说明:该方式一次只能为一张影像数据建立影像金字塔. ArcToolbox--数据管理工具- ...

  5. Linux POSIX共享内存方法&ipcs &struct shmid_ds

    内容是主进程创建子进程计算斐波那契数列. 其中计算到第几项是有主进程命令行输入. 共享内存段,并且查看了一些信息. 参考操作系统概念第七版 3.10,3.11 关于LINUX C库函数 中的 fpri ...

  6. mybatis(一)常见ORM框架及JDBC操作工具类

      转载:https://www.cnblogs.com/wuzhenzhao/p/11075569.html 在Java 程序里面去连接数据库,最原始的办法是使用JDBC 的API.我们先来回顾一下 ...

  7. Taro 3.x in Action

    Taro 3.x in Action React, 小程序 https://taro-docs.jd.com/taro/docs/README Taro Next 跨端, 跨框架 Taro 是一个开放 ...

  8. ::-webkit-scrollbar & hidden scrollbar

    ::-webkit-scrollbar & hidden scrollbar how to hidden ::-webkit-scrollbar *::-webkit-scrollbar { ...

  9. PM2 All In One

    PM2 All In One https://pm2.keymetrics.io/ https://pm2.io/ $ yarn global add pm2 # OR $ npm install p ...

  10. PPT & order & animation

    PPT & order & animation powerpoint order of appearance https://support.office.com/en-us/arti ...