首页 > 其他分享 >昂贵的聘礼

昂贵的聘礼

时间:2022-08-26 18:56:41浏览次数:74  
标签:dist idx vis int 昂贵 聘礼 ver include

题目链接

  因为买一个物品可以有一些替代品来让原先的价格降低,所以可以考虑将每一件物品看成一个点,然后将所有能够替代的物品和此物品连边,物品的价格就作为边权,现在我们就将这个问题转化成了最短路的问题,每一次的答案都是在节点编号为\(1\)的地方取。解决了上面的问题之后,我们还要注意到另外的限制:等级限制,只需要在\(Dijksta\)跑一遍图的时候,加上特判超出了这个等级限制的位置,就忽略掉就好了。

    #include <iostream>
    #include <cstring>
    #include <algorithm>
    #include <queue>
    #include <vector>
    
    using namespace std;
    
    typedef pair<int, int> PII;
    
    const int N = 110, M = 10010;
    
    int k, n;
    int h[N], ne[M], e[M], idx, w[M];
    int level[N], dist[N];
    bool vis[N];
    
    void add(int a, int b, int c) {
        e[++idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx;
    }
    
    int dijkstra(int l, int r) {
        std::priority_queue<PII, vector<PII>, greater<PII> > q;
        memset(dist, 0x3f, sizeof dist);
        memset(vis, 0, sizeof vis);
        dist[0] = 0;
        q.push(std::make_pair(0, 0));
        
        while(!q.empty()) {
            PII t = q.top();
            q.pop();
            int ver = t.second;
        
            if (vis[ver]) continue;
            vis[ver] = true;
            for (int i = h[ver]; i; i = ne[i]) {
                int j = e[i];
                if (level[j] > r || level[j] < l) continue;
                if (dist[j] > dist[ver] + w[i]) {
                    dist[j] = dist[ver] + w[i];
                    q.push(std::make_pair(dist[j], j));
                }
            }
        }
        return dist[1];
    }
    
    int main() {
        scanf("%d%d", &k, &n);
        for (int i = 1; i <= n; i++) {
            int p, l, x;
            scanf("%d%d%d", &p, &l, &x);
            level[i] = l;
            add(0, i, p);
            
            for (int j = 0; j < x; j++) {
                int t, v;
                scanf("%d%d", &t, &v);
                add(t, i, v);
            }
        }
        
        int res = 1E9;
        for (int i = level[1] - k; i <= level[1]; i++){
            res = min(res, dijkstra(i, i + k));
        }
        printf("%d\n", res);
    }

标签:dist,idx,vis,int,昂贵,聘礼,ver,include
From: https://www.cnblogs.com/Haven-/p/16628840.html

相关文章