poj1062-昂贵的聘礼

题目链接 这里

解题思路

中文题,终于不用翻译了。。。

把优惠的物品看成节点,要交的钱看为边权

学到一个技巧:把edge[0][]存每个物品的初始价值

这样求最短路逻辑就比较畅通了。。。

如果你的边是从低阶层指到高阶层,那要枚举最高阶层

如果你的边是从高阶层指向底阶层,那要枚举最底阶层

要不然你就都枚举好了。。。

代码

#include<iostream>
#include<cstdlib>
#include<string.h>
using namespace std;
const int MAX_SIZE = 110;
struct node {
  int value;  //直接交易的价格
  int order;  //地位
}v[MAX_SIZE]; //顶点集合
bool vis[MAX_SIZE];
int edge[MAX_SIZE][MAX_SIZE];  //边集
int q[MAX_SIZE];  //距离
int m, n;
void read()
{
  int k;
  for(int i=1; i<=n; i++) {
    cin >> v[i].value >> v[i].order >> k;
    for(int j=0; j<k; j++) {
      int u;
      cin >> u; cin >> edge[u][i];
    }
    edge[0][i] = v[i].value;
  }
}
int dist(int k)
{
  for(int i=1; i<=n; i++)
    q[i] = v[i].value;
  for(int i=1; i<=n; i++) {
    int minNum = 1e9;
    int x = k;
    for(int j=1; j<=n; j++) {
      if(vis[j]) continue;
      if(q[j] < minNum) { minNum = q[j]; x = j; }
    }
    vis[x] = true;
    for(int j=1; j<=n; j++) {
      if(vis[j]) continue;
      q[j] = min(q[j], q[x] + edge[x][j]);
    }
  }
  return q[1];
}
int main()
{
  int mins = 1e9;
  cin >> m >> n;
  for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) edge[i][j] = 1e9;
  read();  //读取
  for(int i=1; i<=n; i++) {
    int sum;
    memset(vis, 0, sizeof(vis));
    for(int j=1; j<=n; j++)
      if(v[j].order > v[i].order || (v[i].order - v[j].order > m)) {
            vis[j] = true;
      }
    sum = dist(i);
    if(sum < mins) mins = sum;
  }
  cout << mins << endl;
  return 0;
}
时间: 2024-11-09 01:21:44

poj1062-昂贵的聘礼的相关文章

poj1062昂贵的聘礼(Dijkstra**)

1 /* 2 题意: 物主有一个物品,价值为P,地位为L, 以及一系列的替代品Ti和该替代品所对应的"优惠"Vi 3 g[u][i] 表示的是u物品被i物品替换后的优惠价格!(u>0, i>0) 4 g[u][0]表示不用替换该物品的实际价格 ! 5 d[0]表示的是第一个物品经过一系列的物品替换之后的最少优惠价格! 6 7 思路:每当我们通过Dijkstra算法得到离源点(1)最近的距离的节点 p的时候(也就是1...pre[p], p)这条 8 路径上的物品互相替换后得

POJ1062昂贵的聘礼[最短路建模]

昂贵的聘礼 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 45892   Accepted: 13614 Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长降低要求.酋长说:"嗯,如果你能够替我弄到大祭司的皮袄,我可以只要8000金币.如果你能够弄来他的水晶球,那么只要5000

POJ1062 昂贵的聘礼 【DFS】

昂贵的聘礼 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 37475   Accepted: 10816 Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币.便请求酋长减少要求.酋长说:"嗯,假设你能够替我弄到大祭司的皮袄,我能够仅仅要8000金币.假设你能够弄来他的水晶球,那么仅仅要50

poj1062 昂贵的聘礼 (DFS)

A - 昂贵的聘礼 Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 1062 Appoint description: System Crawler (2016-05-06) Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了

【日常学习】【条件最短路dij】POJ1062 昂贵的聘礼(2002年浙江省队选拔赛) 题解

耗时三节课 充分体现出粗心酿成大错这个道理 一开始一直不知道为什么数组越界 原来是minn和ninj写反了 后来又因为杜如函数出为题 反复调试 今后一定要注意 题目还是放上吧: 题目描述 Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长降低要求.酋长说:"嗯,如果你能够替我弄到大祭司的皮袄,我可以只要8000金币.如果你能够弄来他的水晶球,那么只要5

poj1062——昂贵的聘礼(dijkstra变形)

Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长降低要求.酋长说:"嗯,如果你能够替我弄到大祭司的皮袄,我可以只要8000金币.如果你能够弄来他的水晶球,那么只要5000金币就行了."探险家就跑到大祭司那里,向他要求皮袄或水晶球,大祭司要他用金币来换,或者替他弄来其他的东西,他可以降低价格.探险家于是又跑到其他地方,其他人也提出了类似的要求

POJ1062 昂贵的聘礼(带限制的spfa)

Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长降低要求.酋长说:"嗯,如果你能够替我弄到大祭司的皮袄,我可以只要8000金币.如果你能够弄来他的水晶球,那么只要5000金币就行了."探险家就跑到大祭司那里,向他要求皮袄或水晶球,大祭司要他用金币来换,或者替他弄来其他的东西,他可以降低价格.探险家于是又跑到其他地方,其他人也提出了类似的要求

poj1062昂贵的聘礼

题目链接:http://poj.org/problem?id=1062 再一次被题意坑了,这次还是中文题...... 看的题解. 地位差距超过一定限制的两个人之间不会进行任何形式的直接接触,包括交易.他是一个外来人,所以可以不受这些限制.但是如果他和某个地位较低的人进行了交易,地位较高的的人不会再和他交易,他们认为这样等于是间接接触,反过来也一样.也就是说:同一条路径上的任意两个人,等级差不能超过M. 1 #include<cstdio> 2 #include<cstring> 3

POJ1062 昂贵的聘礼(最短路)

说白了就是给你一张图,每一个点有一个等级限制,在等级限制以内求一条最短路. 构图方法:首先将原点0连向每个物品相应的编号,那么边权为物品的初始价格:假设对于物品j,假设有了物品i,那么j的优惠价为w,就在i,j之间连一条权值为w的边.最后枚举等级的范围(注意等级的上下差为m,当中包括了酋长的等级,而不是与酋长等级差的绝对值小于等于m QAQ),求到原点到酋长(0号点到1号点)的最短路. #include<iostream> #include<cstdio> #include<

POJ1062 昂贵的聘礼 Dijkstra+枚举

http://poj.org/problem?id=1062 题目抽象 一张n个节点的带权有向图,每个节点都有一个值,问从各个点出发,到达0节点的最短路加上出发点的值的最小值是多少?(从0节点出发直接算作0号节点的值) 并且其中每个节点都有一个等级,在一条合法的最短路上不允许出现两个节点等级差大于给定值limit. 思路 弄了好久的题.和一般的最短路的区别是有一个limit限制.所以我们可以枚举最小等级,让每个节点的等级都试一下最小等级,然后再求最短路. 注意Dijkstra需要让不存在的边变成