• poj 1062 dijkstra求最短路变形


    题目大意是说有N个物品,每个物品都有自己的价格,但同时某些物品也可以由其他的(可能不止一个)替代品,这些替代品的价格比较“优惠”,问怎么样选取可以让你的花费最少来购买到物品1

    由于有N个物品,我们就可以把它们看作是N个点,从其他点到他的优惠关系视做边,又因为最后总是要找到物品1,然后由于题目是说,这条路劲上不能有两个的等级差超过M,所以我们可以枚举最小等级,将每个点视作最小等级,这样的话就不会掉解。枚举最小等级,然后把等级比他小或者不符合最大限制的点删去,然后在剩下的符合要求的点中再求dij即可。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    #include<stack>
    #include<map>
    #include<vector>
    #include<queue>
    using namespace std;
    #define mp make_pair
    #define x first
    #define y second
    const int INF=0x3f3f3f3f;
    const int N=100+9;
    int w[N][N],d[N],p[N],l[N];
    bool vis[N];
    int n;
    int dij()
    {
        for(int i=1;i<=n;i++)d[i]=p[i];
        for(int i=1;i<=n;i++){
            int x,m=INF;
            for(int j=1;j<=n;j++)if(!vis[j]&&d[j]<=m)m=d[x=j];
            vis[x]=1;
            for(int j=1;j<=n;j++)if(!vis[j])d[j]=min(d[j],d[x]+w[x][j]);
        }
        return d[1];
    }
    int main()
    {
        int m,X,T,V,minn=INF;
        scanf("%d%d",&m,&n);
        memset(w,0x3f,sizeof(w));
        for(int i=1;i<=n;i++){
            scanf("%d%d%d",&p[i],&l[i],&X);
            while(X--){
                scanf("%d%d",&T,&V);
                w[T][i]=V;
            }
        }
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                if(l[i]+m<l[j]||l[j]<l[i])vis[j]=1;
                else vis[j]=0;
            }
            minn=min(minn,dij());
        }
        printf("%d
    ",minn);
        return 0;
    }


  • 相关阅读:
    docker/kubernetes国内源/镜像源解决方式
    logstash的filter之grok
    基于ambari搭建hadoop生态圈大数据组件
    Hadoop整体概述
    flume的配置详解
    Zabbix错误”zbx_mem_malloc(): out of memory”解决方法
    Windows环境下的RTKPlot_Qt版本编译时遇到的问题和解决方法
    基于 win7下虚拟机的 GNSS-SDR安装过程
    博客文章搬迁同步声明
    RTKLIB源码解析(一)——单点定位(pntpos.c)
  • 原文地址:https://www.cnblogs.com/01world/p/5651195.html
Copyright © 2020-2023  润新知