POJ1062

题目链接:http://poj.org/problem?id=1062

解题思路:

  枚举区间+Dijkstra

  一开始理解错了题意,WA了好久。后来参考题解才AC了。

  把每一样物品看成一个点,由物品A换到物品B看成从A指向B的边,这样一来就把问题转换成最短路问题了,具体实现看代码吧。。。关键是枚举区间这一个细节。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <vector>
 4 #include <cmath>
 5 #include <algorithm>
 6 using namespace std;
 7 const int inf=0xfffffff;
 8 const int maxn=100+10;
 9 int thing[maxn],ranks[maxn],vis[maxn],d[maxn];
10 vector<pair<int,int> > vc[maxn];  //a,b           ,ma[maxn],mi[maxn]
11 int road[maxn][maxn];
12 int M,N,t;
13 int dijkstra(int l,int r){
14     for(int i=1;i<=N;i++) {
15         vis[i]=0;
16         d[i]=inf;
17     }
18     d[1]=thing[1];
19     while(1){
20         int v=-1;
21         for(int u=1;u<=N;u++){
22             if(!vis[u]&&(v==-1||d[u]<d[v])) v=u;
23         }
24         if(v==-1)   break;
25         vis[v]=1;
26         for(int u=1;u<=N;u++){
27             if(ranks[u]<=r&&ranks[u]>=l&&d[u]>d[v]+road[v][u]-thing[v]){
28                 d[u]=d[v]+road[v][u]-thing[v];
29             }
30         }
31     }
32     int ans=inf;
33     for(int i=1;i<=N;i++){
34         if(ans>d[i])    ans=d[i];
35     }
36     return ans;
37 }
38 int main(){
39     scanf("%d%d",&M,&N);
40     for(int i=1;i<=N;i++){
41         scanf("%d%d%d",&thing[i],&ranks[i],&t);
42         while(t--){
43             int a,b;
44             scanf("%d%d",&a,&b);
45             vc[i].push_back(make_pair(a,b));
46         }
47     }
48     for(int i=1;i<=N;i++){
49         for(int j=i;j<=N;j++){
50             if(i==j)
51                 road[i][j]=thing[i];
52             else
53                 road[i][j]=road[j][i]=inf;
54         }
55     }
56     for(int i=1;i<=N;i++){
57         for(int j=0;j<vc[i].size();j++){
58             int a=vc[i][j].first,b=vc[i][j].second;
59             if(abs(ranks[a]-ranks[i])>M)    continue;
60             road[i][a]=b+thing[a];
61         }
62     }
63     int ans=inf;
64     for(int i=ranks[1]-M;i<=ranks[1];i++){
65         int temp=dijkstra(i,i+M);
66         if(temp<ans)    ans=temp;
67     }
68
69
70     printf("%d\n",ans);
71     return 0;
72 }

时间: 2024-11-04 22:21:52

POJ1062的相关文章

POJ1062 Expensive dowry 【最短路dijkstra】

详细看:http://blog.csdn.net/lyy289065406/article/details/6645852 简单说一下:每个物品是一个结点,边的权值是,edge[u][v]的值表示用物品u换物品v的价格 一开始所有物品都置为原价,即所有dist[i]为原价,用dijkstra算法,算出0点(啥物品都没有)到各点的最短距离,求出dist[1]即为花费 枚举每个物品的等级为这条交易链的最高等级,把所有等级高于它的或者比它小超过等级限制的点都剔除,可以用bool数组剔除,然后用上述的d

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

ACM/ICPC 之 昂贵的聘礼-最短路解法(POJ1062)

//转移为最短路问题,枚举必经每一个不小于酋长等级的人的最短路 //Time:16Ms Memory:208K #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<algorithm> using namespace std; #define INF 0x3f3f3f3f #define MAX 105 int lim, n; int p[M

poj1062:昂贵的聘礼

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

poj1062昂贵的聘礼

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

POJ1062 昂贵的聘礼 【DFS】

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

昂贵的聘礼---poj1062(最短路)

题目链接:http://poj.org/problem?id=1062 题意很清楚: 可以虚拟一个起点0,由于存在等级关系,所以可以枚举等级,然后把各种关系建立边,然后计算0到1的距离即可,去最小值即可: #include <iostream> #include <stdio.h> #include <math.h> #include <string.h> #include <queue> #include <stack> #incl

poj1062 最短路(加限制)

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

【POJ1062】昂贵的聘礼 最短路 题目描述还有数据都坑爹

题意:中文题,这里只提供题目传送门 http://poj.org/problem?id=1062 题解:首先若物品1可以由物品2加上x元得到,连一条B -> A的单向边,边权为x. 然后源点向每个物品连一条物品直接价格的边. 然后枚举点权的下限和上限. 好吧,很水.但是数据范围坑爹!!!点权还能是0!!而且酋长等级不一定最高!! 贴代码: #include <cstdio> #include <cstring> #include <algorithm> #defi