前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >单源最短路径dijkstra算法_dijkstra是谁

单源最短路径dijkstra算法_dijkstra是谁

作者头像
全栈程序员站长
发布于 2022-09-22 07:15:50
发布于 2022-09-22 07:15:50
75600
代码可运行
举报
运行总次数:0
代码可运行

年轻的探险家来到了一个印第安部落里。

在那里他和酋长的女儿相爱了,于是便向酋长去求亲。

酋长要他用 10000 个金币作为聘礼才答应把女儿嫁给他。

探险家拿不出这么多金币,便请求酋长降低要求。

酋长说:”嗯,如果你能够替我弄到大祭司的皮袄,我可以只要 8000 金币。如果你能够弄来他的水晶球,那么只要 5000 金币就行了。”

探险家就跑到大祭司那里,向他要求皮袄或水晶球,大祭司要他用金币来换,或者替他弄来其他的东西,他可以降低价格。

探险家于是又跑到其他地方,其他人也提出了类似的要求,或者直接用金币换,或者找到其他东西就可以降低价格。

不过探险家没必要用多样东西去换一样东西,因为不会得到更低的价格。

探险家现在很需要你的帮忙,让他用最少的金币娶到自己的心上人。

另外他要告诉你的是,在这个部落里,等级观念十分森严。

地位差距超过一定限制的两个人之间不会进行任何形式的直接接触,包括交易。

他是一个外来人,所以可以不受这些限制。

但是如果他和某个地位较低的人进行了交易,地位较高的的人不会再和他交易,他们认为这样等于是间接接触,反过来也一样。

因此你需要在考虑所有的情况以后给他提供一个最好的方案。

为了方便起见,我们把所有的物品从 1 开始进行编号,酋长的允诺也看作一个物品,并且编号总是 1。

每个物品都有对应的价格 P,主人的地位等级 L,以及一系列的替代品Ti和该替代品所对应的”优惠” Vi。

如果两人地位等级差距超过了 M,就不能”间接交易”。

你必须根据这些数据来计算出探险家最少需要多少金币才能娶到酋长的女儿。

输入格式 输入第一行是两个整数 M,N,依次表示地位等级差距限制和物品的总数。

接下来按照编号从小到大依次给出了 N 个物品的描述。

每个物品的描述开头是三个非负整数 P、L、X,依次表示该物品的价格、主人的地位等级和替代品总数。

接下来 X 行每行包括两个整数 T 和 V,分别表示替代品的编号和”优惠价格”。

输出格式 输出最少需要的金币数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
数据范围
1N100,
1P10000,
1L,MN,
0X<N
输入格式
1 4
10000 3 2
2 8000
3 5000
1000 2 1
4 200
3000 2 1
4 200
50 2 0
输出格式
5250

题解 最短路

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include<bits/stdc++.h>
using namespace std;
const int N = 1e2 + 10;
const int M = 2e4 + 10;
typedef pair<int,int>PII;
#define x first
#define y second
struct Edge{ 
   
    int v,next,w;
}edge[M];
int st[N],value[N];
int dist[N],vis[N];
const int INF = 0x3f3f3f3f;
int n;
int head[N],cnt;
void add(int u,int v,int w){ 
   
    edge[cnt].v = v;
    edge[cnt].w = w;
    edge[cnt].next = head[u];
    head[u] = cnt ++;
}
int dijstra(int s,int low,int high){ 
   
    priority_queue<PII,vector<PII>,greater<PII> >pq;
    memset(dist,INF,sizeof dist);
    memset(vis,0,sizeof vis);
    dist[s] = 0;
    pq.push({ 
   dist[s],s});
    while(!pq.empty()){ 
   
        int t = pq.top().y;
        pq.pop();
        if(vis[t])continue;
        vis[t] = true;
        for(int i= head[t];~i;i = edge[i].next){ 
   
            int v = edge[i].v,w = edge[i].w;
            if(vis[v] || st[v] < low || st[v] > high)continue;
            if(dist[v] > dist[t] + w){ 
   
                dist[v] = dist[t] + w;
                pq.push({ 
   dist[v],v});
            }
        }
    }
    int res = INF;
    for(int i = 1;i <= n;i ++){ 
   
        res = min(res,dist[i] + value[i]);
    }
    return res;
}
int main(){ 
   
    int K,P,L,X,x,w;
    cin>>K>>n;
    memset(head,-1,sizeof head);
    for(int i = 1;i <= n;i ++){ 
   
        cin>>value[i]>>st[i]>>X;
        for(int j = 0;j < X;j ++){ 
   
            cin>>x>>w;
            add(i,x,w);
        }
    }
    int res = INF;
    for(int low = st[1] - K;low <= st[1];low ++){ 
   
        int high = low + K;
        res = min(res,dijstra(1,low,high));
    }
    cout<<res<<endl;
    
    return 0;
}

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/168631.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档