poj1062 最短路

时间:2023-03-08 23:20:48
poj1062 最短路

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

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

 #include<stdio.h>
#include<string.h>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
typedef pair<int,int> pii; struct cmp{
bool operator ()(pii a,pii b){
return a.first>b.first;
}
}; int head[],point[],val[],next[],size;
int n,x,l[],dist[]; void add(int a,int b,int v){
int i;
for(i=head[a];~i;i=next[i]){
if(point[i]==b){
if(val[i]>v)val[i]=v;
return;
}
}
point[size]=b;
val[size]=v;
next[size]=head[a];
head[a]=size++;
} int dij(int s,int t){
int i;
memset(dist,0x3f,sizeof(dist));
dist[]=;
priority_queue<pii,vector<pii>,cmp>q;
q.push(make_pair(dist[],));
while(!q.empty()){
pii u=q.top();
q.pop();
if(u.first>dist[u.second])continue;
for(i=head[u.second];~i;i=next[i]){
int j=point[i];
if(l[j]>=l[s]&&l[j]<=l[s]+x&&dist[j]>u.first+val[i]){
dist[j]=u.first+val[i];
q.push(make_pair(dist[j],j));
}
}
}
return dist[t];
} int main(){
while(scanf("%d%d",&x,&n)!=EOF){
int i,j;
memset(head,-,sizeof(head));
size=;
for(i=;i<=n;i++){
int num,b,v;
scanf("%d%d%d",&v,&l[i],&num);
add(,i,v);
for(j=;j<=num;j++){
scanf("%d%d",&b,&v);
add(b,i,v);
}
}
int ans=0x3f3f3f3f;
for(i=;i<=n;i++){
int tmp=dij(i,);
if(ans>tmp)ans=tmp;
}
printf("%d\n",ans);
}
return ;
}