zoukankan      html  css  js  c++  java
  • POJ

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

    #include <iostream>
    #include <string>
    #include <cstring>
    #include <cmath>
    #define N 105
    #define MAX 0x3f3f3f3f
    using namespace std;
    /****************************************************************************************************************
                题意:题目大意是说有N个物品,每个物品都有自己的价格,但同时某些物品也可以由其他的(可能不止一个)
                    替代品,这些替代品的价格比较“优惠”,问怎么样选取可以让你的花费最少来购买到物品1
                思路:
                1,dijkstra算法
                2,如何建图:
                    a,以每件物品和它的替代品建图(注意等级差必须在规定范围内)
                    b,以每个入度为0的点为起点,以第一个点(酋长的物品)为终点,搜索最短路
                    c,如何做到2呢?将所有点和一个新结点关联(程序中0为这个结点),初始化边为每个结点的花费
                3,建图结束后基本上直接套板子就可以了,起点 = 0,终点 = 1,搜索找到最短边
    ****************************************************************************************************************/
    struct Goods
    {
        int p,l,v;
        int num[N];
        int val[N];
    }goods[N];
    int Map[N][N];
    int visit[N],dist[N];
    int m,n;
    
    int dijkstra(int st)
    {
        int leval=goods[st].l;
        memset(dist,MAX,sizeof(dist));
        memset(visit,0,sizeof(visit));
    
        for(int i = 0;i <= n;i ++)
            if(goods[i].l - leval <= m && goods[i].l >= leval)
                dist[i]=Map[0][i];
    
        dist[0]=0;
        visit[0]=1;
    
        for(int i = 0;i < n;i ++){
            int id=MAX,ans=MAX;
            for(int j = 0;j <= n;j ++)
                if(!visit[j] && dist[j] < ans)
                    ans=dist[id=j];
            if(id == MAX)   break;
            visit[id]=1;
            for(int j = 0;j <= n;j ++)
                if(!visit[j] && goods[j].l - leval <= m && goods[j].l >= leval)
                    if(dist[j] > dist[id]+Map[id][j])
                        dist[j]=dist[id]+Map[id][j];
        }
        return dist[1];
    }
    int main()
    {
        while(cin>>m>>n)
        {
            memset(Map,MAX,sizeof(Map));
            memset(goods,0,sizeof(goods));
    
    
            for(int i = 1;i <= n;i ++){
                cin>>goods[i].p>>goods[i].l>>goods[i].v;
                for(int j = 0;j < goods[i].v;j ++)
                    cin>>goods[i].num[j]>>goods[i].val[j];
                Map[0][i]=goods[i].p;       //建立新结点实现 2.c
            }
    
            for(int i = 1;i <= n;i ++)
                for(int j = 0;j < goods[i].v;j ++)
                    if(fabs(goods[goods[i].num[j]].l - goods[i].l) <= m && goods[i].val[j] < Map[goods[i].num[j]][i])
                        Map[goods[i].num[j]][i]=goods[i].val[j];
    
            /*for(int i = 0;i <= n;i ++){
                for(int j = 0;j <= n;j ++)
                    cout<<Map[i][j]<<"    ";
                cout<<endl;
            }*/
    
            int ansN=MAX;
            for(int i = 1;i <= n;i ++){     //搜索每种物品的替代品情况,找到花费最小的
                int temp=dijkstra(i);
                if(temp < ansN)
                    ansN=temp;
            }
            cout<<ansN<<endl;
        }
        return 0;
    }
    



  • 相关阅读:
    touchesBegan: withEvent: <--- with UIScrollView / UIImageView
    #ifdef,#else,#endif,#if 拾忆
    内联函数 inline 漫谈
    WebKit框架 浅析
    在iOS中获取UIView的所有层级结构 相关
    initWithFrame、initWithCoder、awakeFromNib的区别和调用次序 & UIViewController生命周期 查缺补漏
    iOS 常用代码块
    NSObject Class 浅析
    Alamofire 框架浅析
    ReactiveX--响应式编程の相关概念 浅析
  • 原文地址:https://www.cnblogs.com/Jstyle-continue/p/6351987.html
Copyright © 2011-2022 走看看