poj1062(昂贵的聘礼)

题目大意:

中文题目不用翻译。

说下通俗的题意:M代表等级的权限限制,N代表有N个地方,其中酋长地方的编号永远是第一个编号,所以输入的第一组数据就是酋长的允诺编号为1.
接着有X行能与此地方交换物品和拥有替代品之后的价格。其中P代表这个地方的价值,L代表这个地方的等级。问你怎么用自己的聪明才智使得到达编号1
这个地方的花费最少。

测试实例的走法: 4->2->1  一共花费5250.

解题思路:

建图,dijstra最短路。

注意:

代码:

  1 #include <algorithm>
2 #include <iostream>
3 #include <sstream>
4 #include <cstdlib>
5 #include <cstring>
6 #include <cstdio>
7 #include <string>
8 #include <bitset>
9 #include <vector>
10 #include <queue>
11 #include <stack>
12 #include <cmath>
13 #include <list>
14 //#include <map>
15 #include <set>
16 using namespace std;
17 /***************************************/
18 #define ll long long
19 #define int64 __int64
20 /***************************************/
21 const int INF = 0x7f7f7f7f;
22 const double eps = 1e-8;
23 const double PIE=acos(-1.0);
24 const int d1x[]= {0,-1,0,1};
25 const int d1y[]= {-1,0,1,0};
26 const int d2x[]= {0,-1,0,1};
27 const int d2y[]= {1,0,-1,0};
28 const int fx[]= {-1,-1,-1,0,0,1,1,1};
29 const int fy[]= {-1,0,1,-1,1,-1,0,1};
30 /***************************************/
31 void openfile()
32 {
33 freopen("data.in","rb",stdin);
34 freopen("data.out","wb",stdout);
35 }
36 /**********************华丽丽的分割线,以上为模板部分*****************/
37 int lowcost[100],level[100]; //到此地方的最少花费、此地方的等级
38 int vis[100];
39 int map[100][100];
40 int min1;
41 void dijstra(int m,int n)
42 {
43 int i,j,k;
44 int min;
45 min1=INF;
46 for(int lev=level[1]-m; lev<=level[1]; lev++) //枚举等级区间
47 {
48 for(i=1; i<=n; i++)
49 {
50 lowcost[i]=map[0][i];
51 vis[i]=0;
52 }
53 int sum=0;
54 for (j=1; j<=n; j++)
55 if (level[j]<lev||level[j]>lev+m) //把不再此等级范围内的地方标记
56 {
57 vis[j]=1;
58 sum++;
59 }
60 for(i=1; i<=n-1-sum; i++)
61 {
62 j=0;
63 min=INF;
64 for(k=1; k<=n; k++)
65 {
66 if (!vis[k]&&lowcost[k]<min)
67 {
68 min=lowcost[k];
69 j=k;
70 }
71 }
72 vis[j]=1;
73 for(k=1; k<=n; k++)
74 if (!vis[k]&&(map[j][k]+lowcost[j]<lowcost[k]))
75 lowcost[k]=map[j][k]+lowcost[j];
76 }
77 if (lowcost[1]<min1)
78 min1=lowcost[1];
79 }
80 }
81 int main()
82 {
83 int m,n;
84 while(scanf("%d%d",&m,&n)!=EOF)
85 {
86 int i,j;
87 for(i=0; i<=n; i++)
88 for(j=0; j<=n; j++)
89 map[i][j]=INF;
90 for(i=1; i<=n; i++)
91 {
92 int a,b,c;
93 scanf("%d%d%d",&a,&b,&c);
94 level[i]=b;
95 map[0][i]=a;
96 for(j=0; j<c; j++)
97 {
98 int x,val;
99 scanf("%d%d",&x,&val);
100 if (map[i][x]>val) //有向图
101 {
102 // map[i][x]=val;
103 map[x][i]=val;
104 }
105 }
106 }
107 dijstra(m,n);
108 printf("%d\n",min1);
109 }
110 return 0;
111 }

时间: 2024-11-08 22:57:15

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需要让不存在的边变成