zoukankan      html  css  js  c++  java
  • poj1062 最短路

    题意:有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
    ",ans);
    73     }
    74     return 0;
    75 }
    View Code
  • 相关阅读:
    《数据结构与算法之美》01——系统高效地学习数据结构与算法
    Cookie:SameSite,防止CSRF攻击
    HeadFirst学习笔记-2.观察者(Observer)模式
    HeadFirst学习笔记-1. 设计模式入门
    Redis深入解析系列一:sql与nosql比较
    MySQL优化系列2-索引原理和优化
    MySQL优化系列1-MySQL体系结构
    java集合-ArrayList中EMPTY_ELEMENTDATA与DEFAULTCAPACITY_EMPTY_ELEMENTDATA的区别
    java集合ArrayList中modCount的作用
    java中的System.arraycopy
  • 原文地址:https://www.cnblogs.com/cenariusxz/p/4785378.html
Copyright © 2011-2022 走看看