poj1062昂贵的聘礼(枚举+最短路)

题意

额,直接看题目吧,反正也是中文题,不好用几句话表述清楚~~~
题目链接

解题思路

因为等级差距不能间接交易,所以每个交易的等级都在一个区间内,这个区间必须包含大祭司的等级,可以把区间枚举,设大祭司等级为L,则需要从[L-M,L],一直枚举到[L,L+M],保证所有交易的点的等级都在这个区间内就可以了,然后在进行最短路处理,进行最短路的过程中,先不考虑直接购买物品的价值,直接全部走兑换的形式,然后把得到的数组加上直接购买物品的价值,从中找到最小值就是答案。

AC代码

#include<vector>
#include<algorithm>
#include<cstdio>
#include<iostream>
#include<set>
#include<cstring>
#include<map>
#include<cmath>
#include<queue>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<int,pii> PII;
const int maxn = 1e4+5;
struct Node
{
    int val,level;
    int X;
    vector<pii> vp;
};
struct Edge
{
    int from,to,val;
};
Node L[maxn];
vector<Edge> G[maxn];
int dis[maxn];
bool vis[maxn];
int N,M;

int dijkstra()
{
    memset(dis,0x3f,sizeof(dis));
    memset(vis,0,sizeof(vis));
    priority_queue<pii,vector<pii>,greater<pii> > Q;
    dis[1] = 0;
    Q.push(pii(dis[1],1));
    while(!Q.empty()){
        pii t = Q.top();
        Q.pop();
        int d = t.first;
        int u = t.second;
        for(int i=0;i<G[u].size();i++){
            Edge e = G[u][i];
            if(e.val + d < dis[e.to]){
                dis[e.to] = e.val + d;
                Q.push(pii(dis[e.to],e.to));
            }
        }
    }
    int ans = 1<<30;
    for(int i=1;i<=N;i++){
        dis[i] += L[i].val;
        ans = min(ans,dis[i]);
    }
    return ans;
}

int main(int argc, char const *argv[])
{
    cin >> M >> N;
    int a,b;
    for(int i=1;i<=N;i++){
        cin >> L[i].val >> L[i].level >> L[i].X;
        for(int j=0;j<L[i].X;j++){
            cin >> a >> b;
            L[i].vp.push_back(pii(a,b));
        }
    }
    Edge e;
    int left = max(0,L[1].level-M), right = left + M;
    int ans = 1<<30;
    while(left <= L[1].level){
        for(int i=0;i<=N;i++){
            G[i].clear();
        }
        for(int i=1;i<=N;i++){
                for(int j=0;j<L[i].X;j++){
                    int next = L[i].vp[j].first;
                    if (L[next].level >= left && L[next].level <= right)
                    {
                        e.from = i;
                        e.to = next;
                        e.val = L[i].vp[j].second;
                        G[e.from].push_back(e);
                    }
            }
        }
        left++,right++;
        int te = dijkstra();
        ans = min(ans,te);
    }
    cout << ans << endl;

    return 0;
}

原文地址:https://www.cnblogs.com/django-lf/p/9736713.html

时间: 2024-08-01 15:18:31

poj1062昂贵的聘礼(枚举+最短路)的相关文章

poj1062昂贵的聘礼(Dijkstra**)

1 /* 2 题意: 物主有一个物品,价值为P,地位为L, 以及一系列的替代品Ti和该替代品所对应的"优惠"Vi 3 g[u][i] 表示的是u物品被i物品替换后的优惠价格!(u>0, i>0) 4 g[u][0]表示不用替换该物品的实际价格 ! 5 d[0]表示的是第一个物品经过一系列的物品替换之后的最少优惠价格! 6 7 思路:每当我们通过Dijkstra算法得到离源点(1)最近的距离的节点 p的时候(也就是1...pre[p], p)这条 8 路径上的物品互相替换后得

昂贵的聘礼(最短路)

Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长降低要求.酋长说:"嗯,如果你能够替我弄到大祭司的皮袄,我可以只要8000金币.如果你能够弄来他的水晶球,那么只要5000金币就行了."探险家就跑到大祭司那里,向他要求皮袄或水晶球,大祭司要他用金币来换,或者替他弄来其他的东西,他可以降低价格.探险家于是又跑到其他地方,其他人也提出了类似的要求

POJ1062昂贵的聘礼[最短路建模]

昂贵的聘礼 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 45892   Accepted: 13614 Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长降低要求.酋长说:"嗯,如果你能够替我弄到大祭司的皮袄,我可以只要8000金币.如果你能够弄来他的水晶球,那么只要5000

poj 1062 昂贵的聘礼 (最短路)

poj 1062 昂贵的聘礼 Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长降低要求.酋长说:"嗯,如果你能够替我弄到大祭司的皮袄,我可以只要8000金币.如果你能够弄来他的水晶球,那么只要5000金币就行了."探险家就跑到大祭司那里,向他要求皮袄或水晶球,大祭司要他用金币来换,或者替他弄来其他的东西,他可以降低价格.探险家于是又跑到其他

POJ 1062 昂贵的聘礼(最短路中等题)

昂贵的聘礼 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 51879   Accepted: 15584 Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长降低要求.酋长说:"嗯,如果你能够替我弄到大祭司的皮袄,我可以只要8000金币.如果你能够弄来他的水晶球,那么只要5000

POJ1062 昂贵的聘礼 【DFS】

昂贵的聘礼 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 37475   Accepted: 10816 Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币.便请求酋长减少要求.酋长说:"嗯,假设你能够替我弄到大祭司的皮袄,我能够仅仅要8000金币.假设你能够弄来他的水晶球,那么仅仅要50

poj1062 昂贵的聘礼 (DFS)

A - 昂贵的聘礼 Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 1062 Appoint description: System Crawler (2016-05-06) Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了

POJ1062 昂贵的聘礼(最短路)

说白了就是给你一张图,每一个点有一个等级限制,在等级限制以内求一条最短路. 构图方法:首先将原点0连向每个物品相应的编号,那么边权为物品的初始价格:假设对于物品j,假设有了物品i,那么j的优惠价为w,就在i,j之间连一条权值为w的边.最后枚举等级的范围(注意等级的上下差为m,当中包括了酋长的等级,而不是与酋长等级差的绝对值小于等于m QAQ),求到原点到酋长(0号点到1号点)的最短路. #include<iostream> #include<cstdio> #include<

【日常学习】【条件最短路dij】POJ1062 昂贵的聘礼(2002年浙江省队选拔赛) 题解

耗时三节课 充分体现出粗心酿成大错这个道理 一开始一直不知道为什么数组越界 原来是minn和ninj写反了 后来又因为杜如函数出为题 反复调试 今后一定要注意 题目还是放上吧: 题目描述 Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长降低要求.酋长说:"嗯,如果你能够替我弄到大祭司的皮袄,我可以只要8000金币.如果你能够弄来他的水晶球,那么只要5