POJ-1062(原始dijiksra算法+思维)
昂贵的婚礼
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算法+思维)的更多相关文章
- 最短路(Dijkstra) POJ 1062 昂贵的聘礼
题目传送门 /* 最短路:Dijkstra算法,首先依照等级差距枚举“删除”某些点,即used,然后分别从该点出发生成最短路 更新每个点的最短路的最小值 注意:国王的等级不一定是最高的:) */ #i ...
- POJ 1062 昂贵的聘礼
C - 昂贵的聘礼 Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u Submit St ...
- POJ 1062 昂贵的聘礼(图论,最短路径)
POJ 1062 昂贵的聘礼(图论,最短路径) Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女 ...
- 最短路POJ 1062 昂贵的聘礼
C - 昂贵的聘礼 Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u Submit St ...
- [MIT6.006] 1. Algorithmic Thinking, Peak Finding 算法思维,峰值寻找
[MIT6.006] 系列笔记将记录我观看<MIT6.006 Introduction to Algorithms, Fall 2011>的课程内容和一些自己补充扩展的知识点.该课程主要介 ...
- POJ 1062 昂贵的聘礼(枚举限制条件——Dijkstra算法)
题目: 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长降低要求.酋长说:& ...
- poj 1062 昂贵的聘礼 (dijkstra最短路)
题目链接:http://poj.org/problem?id=1062 昂贵的聘礼 Time Limit: 1000MS Memory Limit: 10000K Total Submission ...
- POJ 1062 ( dijkstra )
http://poj.org/problem?id=1062 一个中文题,一个多月之前我做过,当时我是用搜索写的,不过苦于卡在无法确定等级关系,所以就错了. 看了别人的博客后,我还是不是很理解所谓的枚 ...
- POJ 矩阵相乘 (随机化算法-舍伍德(Sherwood))
周三的算法课,主要讲了随机化算法,介绍了拉斯维加斯算法,简单的理解了为什么要用随机化算法,随机化算法有什么好处. 在处理8皇后问题的时候,穷举法是最费时的,回朔比穷举好点,而当数据量比较大的时候,如1 ...
随机推荐
- Unmanaged Exports not creating a .lib file
别用VS2017!别用VS2017!别用VS2017!去吧.
- 鸟哥的linux私房菜——第十二章学习(Shell Scripts)
第十二章 Shell Scripts 1.0).什么是shell scripts? script 是"脚本.剧本"的意思.整句话是说, shell script 是针对 shel ...
- 解决关闭ssh后网页停止服务的方法,利用nohup
上一篇文章提到宝塔面板无法运行,只能用ssh运行app.py. 关闭ssh时,app.py会被杀死.因为app.py的父进程就是ssh,关掉ssh会造成进程被杀死. 解决方法参考 https://w ...
- spring-cloud-sleuth/zipkin
Spring Cloud Sleuth 一般的,一个分布式服务跟踪系统,主要有三部分:数据收集.数据存储和数据展示.根据系统大小不同,每一部分的结构又有一定变化.譬如,对于大规模分布式系统,数据存储可 ...
- 006.NET 项目建立+传值
1. 创建项目 2.传值(控制器向视图传递) 接收值 3.视图向控制器传递 4.session配置
- Apple & 人体工程学
Apple & 人体工程学 https://support.apple.com/zh-cn/HT205655 MBP 2018 https://help.apple.com/macbookpr ...
- How to Use RSS on Your Website
RSS feed 1 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...
- Chrome V8 引擎源码剖析
Chrome V8 引擎源码剖析 V8 https://github.com/v8/v8 array & sort https://github.com/v8/v8/search?l=Java ...
- css animation & animationend event & onanimationend
css animation & animationend event & onanimationend https://developer.mozilla.org/en-US/docs ...
- write a node cli tools, step by step
write a node cli tools, step by step how to write a node cli tools node cli tools, step by step, nod ...