昂贵的婚礼

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 #693 (Div. 3) G. Moving to the Capital (图,dp)

    题意:有一张有向图,每个点的权值为点\(1\)到该点的最短距离(每条边的长度为\(1\)),对于一条路径,这条路径上最多只能有一条边,这条边起点的权值不小于终点,现在要求每个点能到达路径上的点的最小权 ...

  2. Codeforces Round #171 (Div. 2) B. Books (模拟队列)

    题意:有一组数,问子数组和最大不超过\(t\)的最多元素个数. 题解:用数组模拟队列,不断的往里面放,队列中的元素之和大于\(t\),就不断地从队头弹出直到满足条件,维护一个最大值即可. 代码: in ...

  3. Bone Collector II HDU - 2639 01背包第k最大值

    题意: 01背包,找出第k最优解 题解: 对于01背包最优解我们肯定都很熟悉 第k最优解的话也就是在dp方程上加一个维度来存它的第k最优解(dp[i][j]代表,体积为i能获得的第j最大价值) 对于每 ...

  4. 导出Excel出错

    错误提示:   解决方法: 1.运行dcomcnfg打开组件服务. 2.依次展开"组件服务"->"计算机"->"我的电脑"-&g ...

  5. Linux下的C语言编程

    一.在Linux下的C语言编程所需工具(下面所列举的都是我编程所用的工具) 1.文本编辑器 Vim 2.编译链接工具 gcc 3.调试器 gdb 4.项目管理工具 make和makefile 二.VI ...

  6. Dapr是如何简化微服务的开发和部署

    基于微服务设计模式的现代应用程序面临着一系列挑战.微服务需要有一个强大的服务发现机制来实现动态连接.它们需要松散耦合,实现自主性和独立缩放.微服务需要支持多种语言,其中每个服务都是以最合适的语言.框架 ...

  7. 1076D Edge Deletion 【最短路】

    题目:戳这里 题意:求出1到所有点的最短路径后,把边减到小于等于k条,问保留哪些边可以使仍存在的最短路径最多. 解题思路:这题就是考求最短路的原理.比如dijkstra,用优先队列优化后存在队列中的前 ...

  8. codeforce 3C

    B. Lorry time limit per test 2 seconds memory limit per test 64 megabytes input standard input outpu ...

  9. 痞子衡嵌入式:我的博文总量终于追平了jicheng0622

    自打2016年10月选定清爽又复古的博客园平台作为痞子衡的个人博客主战场之后,痞子衡就一直坚持在博客园首发原创技术文章,然后再同步到其他平台(CSDN,知乎,微信公众号...),在坚持更文近四年半(2 ...

  10. you don't know github

    you don't know GitHub <!DOCTYPE html> <html lang="en"> <head> <meta c ...