码迷,mamicode.com
首页 > 其他好文 > 详细

poj1062 最短路

时间:2015-09-06 14:40:23      阅读:130      评论:0      收藏:0      [点我收藏+]

标签:

题意:有n个物品,任务是得到1号物品,现在每个物品有它的主人,你可以用金钱购买物品,当然也可以用其他物品加上优惠的价格换取,但是有个要求,因为每个物品的主人有各自的等级,你所交易过的人中,等级差不能超过一个给定的值,问得到1号物品最少要花费多少钱。

其实就是最短路,从0到各物品的花费是物品的直接购买价格,然后可以通过一个物品换得其他物品,那就可以建边,权为优惠价格。然后由于有等级限制,所以可以枚举最低等级,然后最短路的计算中只考虑等级在最低等级到其对应的等级上限之间的点,然后取最小值作为答案就行。坑爹的是酋长竟然不一定是等级最高的……难道等级最高的是老王?

技术分享
 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<algorithm>
 4 #include<vector>
 5 #include<queue>
 6 using namespace std;
 7 typedef pair<int,int> pii;
 8 
 9 struct cmp{
10     bool operator ()(pii a,pii b){
11         return a.first>b.first;
12     }
13 };
14 
15 int head[105],point[10000],val[10000],next[10000],size;
16 int n,x,l[105],dist[105];
17 
18 void add(int a,int b,int v){
19     int i;
20     for(i=head[a];~i;i=next[i]){
21         if(point[i]==b){
22             if(val[i]>v)val[i]=v;
23             return;
24         }
25     }
26     point[size]=b;
27     val[size]=v;
28     next[size]=head[a];
29     head[a]=size++;
30 }
31 
32 int dij(int s,int t){
33     int i;
34     memset(dist,0x3f,sizeof(dist));
35     dist[0]=0;
36     priority_queue<pii,vector<pii>,cmp>q;
37     q.push(make_pair(dist[0],0));
38     while(!q.empty()){
39         pii u=q.top();
40         q.pop();
41         if(u.first>dist[u.second])continue;
42         for(i=head[u.second];~i;i=next[i]){
43             int j=point[i];
44             if(l[j]>=l[s]&&l[j]<=l[s]+x&&dist[j]>u.first+val[i]){
45                 dist[j]=u.first+val[i];
46                 q.push(make_pair(dist[j],j));
47             }
48         }
49     }
50     return dist[t];
51 }
52 
53 int main(){
54     while(scanf("%d%d",&x,&n)!=EOF){
55         int i,j;
56         memset(head,-1,sizeof(head));
57         size=0;
58         for(i=1;i<=n;i++){
59             int num,b,v;
60             scanf("%d%d%d",&v,&l[i],&num);
61             add(0,i,v);
62             for(j=1;j<=num;j++){
63                 scanf("%d%d",&b,&v);
64                 add(b,i,v);
65             }
66         }
67         int ans=0x3f3f3f3f;
68         for(i=1;i<=n;i++){
69             int tmp=dij(i,1);
70             if(ans>tmp)ans=tmp;
71         }
72         printf("%d\n",ans);
73     }
74     return 0;
75 }
View Code

 

poj1062 最短路

标签:

原文地址:http://www.cnblogs.com/cenariusxz/p/4785378.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!