动态规划优缺点_巴西优化航空路线利用率

动态规划优缺点_巴西优化航空路线利用率C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市。任意两个城市之间最多只有一条道路直接相连。这 m 条道路中有一部分为单向通行的道路,一部分为双向通行的道路,双向通行的道路在统计条数时也计为 1 条。C 国幅员辽阔,各地的资源分布情况各不相同,这就导致了同一种商品在不同城市的价格不一定相同。但是,同一种商品在同一个城市的买入价和卖出价始终是相同的。商人阿龙来到 C 国旅游。当他得知“同一种商品在不同城市的价格可能会不同”这一信息之后,便决定在旅游的同时,利用商品在

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市。

任意两个城市之间最多只有一条道路直接相连。

这 m 条道路中有一部分为单向通行的道路,一部分为双向通行的道路,双向通行的道路在统计条数时也计为 1 条。

C 国幅员辽阔,各地的资源分布情况各不相同,这就导致了同一种商品在不同城市的价格不一定相同。

但是,同一种商品在同一个城市的买入价和卖出价始终是相同的。

商人阿龙来到 C 国旅游。

当他得知“同一种商品在不同城市的价格可能会不同”这一信息之后,便决定在旅游的同时,利用商品在不同城市中的差价赚一点旅费。

设 C 国 n 个城市的标号从 1∼n,阿龙决定从 1 号城市出发,并最终在 n 号城市结束自己的旅行。

在旅游的过程中,任何城市可以被重复经过多次,但不要求经过所有 n 个城市。

阿龙通过这样的贸易方式赚取旅费:他会选择一个经过的城市买入他最喜欢的商品——水晶球,并在之后经过的另一个城市卖出这个水晶球,用赚取的差价当做旅费。

因为阿龙主要是来 C 国旅游,他决定这个贸易只进行最多一次,当然,在赚不到差价的情况下他就无需进行贸易。

现在给出 n 个城市的水晶球价格,m 条道路的信息(每条道路所连接的两个城市的编号以及该条道路的通行情况)。

请你告诉阿龙,他最多能赚取多少旅费。

注意:本题数据有加强。

输入格式
第一行包含 2 个正整数 n 和 m,中间用一个空格隔开,分别表示城市的数目和道路的数目。

第二行 n 个正整数,每两个整数之间用一个空格隔开,按标号顺序分别表示这 n 个城市的商品价格。

接下来 m 行,每行有 3 个正整数,x,y,z,每两个整数之间用一个空格隔开。

如果 z=1,表示这条道路是城市 x 到城市 y 之间的单向道路;如果 z=2,表示这条道路为城市 x 和城市 y 之间的双向道路。

输出格式
一个整数,表示答案。

数据范围
1≤n≤100000,
1≤m≤500000,
1≤各城市水晶球价格≤100

输入样例:
5 5
4 3 5 6 1
1 2 1
1 4 1
2 3 2
3 5 1
4 5 2
输出样例:
5

题解
环形动态规划最短路,所有方案可以按照中间节点来划分,dmin[i]:代表节点i之前节点的所有最小值,dmax[i]:代表节点i之后所有节点的最大值,由于是环形的动态规划,所以要用spfa算法求解。

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
const int M = 2 * N;
struct Edge{ 
   
    int next,v;
}edge[M],redge[M];
int head[N],rhead[N],cnt,rcnt;
int a[N];
int n,m;
int vis[N],q[N],hh,tt;
int dmin[N],dmax[N];
const int INF = 0x3f3f3f3f;
void add(int u,int v,int head[],Edge edge[],int &cnt){ 
   
    edge[cnt].v = v;
    edge[cnt].next = head[u];
    head[u] = cnt ++;
}
int spfa(int s,int e){ 
   
    hh = 0,tt = 1;
    q[hh] = s;
    vis[s] = true;
    memset(dmin,INF,sizeof dmin);
    memset(dmax,0,sizeof dmax);
    dmin[0] = a[0];
    dmax[e] = a[e];
    vis[0] = true;
    while(hh < tt){ 
   
        int t = q[hh ++];
        if(hh == N)hh = 0;
        vis[t] = false;
        for(int i = head[t];~i;i = edge[i].next){ 
   
            int v = edge[i].v;
            if(dmin[v] > min(dmin[t],a[v])){ 
   
                dmin[v] = min(dmin[t],a[v]);
                if(!vis[v]){ 
   
                    q[tt ++] = v;
                    if(tt == N)tt = 0;
                    vis[v] = true;
                }
            }
        }
    }
    hh = 0,tt = 1;
    q[hh] = n;
    while(hh < tt){ 
   
        int t = q[hh ++];
        if(hh == N)hh = 0;
        vis[t] = false;
        for(int i = rhead[t];~i;i = redge[i].next){ 
   
            int v = redge[i].v;
            if(dmax[v] < max(dmax[t],a[v])){ 
   
                dmax[v] = max(dmax[t],a[v]);
                if(!vis[v]){ 
   
                    q[tt ++] = v;
                    if(tt == N)tt = 0;
                    vis[v] = true;
                }
            }
        }
    }
    int ans = 0;
    for(int i = 1;i <= n;i ++)ans = max(dmax[i] - dmin[i],ans);
    return ans;
}
int main(){ 
   
    cin>>n>>m;
    int x,y,w;
    memset(head,-1,sizeof head);
    memset(rhead,-1,sizeof rhead);
    for(int i = 1;i <= n;i ++)cin>>a[i];
    for(int i = 0;i < m;i ++){ 
   
        cin>>x>>y>>w;
        add(x,y,head,edge,cnt),add(y,x,rhead,redge,rcnt);
        if(w == 2)add(y,x,head,edge,cnt),add(x,y,rhead,redge,rcnt);
    }
    cout<<spfa(1,n)<<endl;
    return 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

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

(0)
上一篇 2022年8月9日 下午10:16
下一篇 2022年8月9日 下午10:16


相关推荐

  • ubuntu安装yarn

    ubuntu安装yarn1、安装yarnsudoapt-getupdatesudoapt-getupgradecurl-sShttps://dl.yarnpkg.com/debian/pubkey.gpg|sudoapt-keyadd-echo”debhttps://dl.yarnpkg.com/debian/stablemain”|sudotee/etc/apt/s…

    2022年5月25日
    36
  • getElementById 使用

    getElementById 使用getElementById()方法可返回对拥有指定ID的第一个对象的引用里面跟着的必须是元素ID属性值,如果class的值是不可以的一个小demo<!DOCTYPEhtml><html> <head> <metacharset=”utf-8″> <title>菜鸟教程(runoob.com)&l…

    2022年7月15日
    16
  • 动态库学习[通俗易懂]

    动态库学习[通俗易懂]总结一:动态库前言 我们知道程序编译链接经常使用动态,同时我们可能还知道,动态库时程序运行时加载的。但是动态库到底有什么作用,如何生成、如何加载等,我们却很少关注。接下来,我给大家做一个简单的介绍。1.1动态库和静态库的区别静态库特点(linux):命名上是以*.o结尾静态库在链接阶段直接就加入到可执行的文件中了,在执行过程中无需该静态库相对于动态库生成的文件,使用静态库生…

    2022年9月30日
    5
  • jmeter测试服务器性能测试报告,Jmeter的性能测试

    jmeter测试服务器性能测试报告,Jmeter的性能测试需要分析的系统信息需要分析的业务信息性能需求评估确定性能测试点:关键业务:确定被测项目是否属于关键业务,有哪些主要的业务逻辑点,特别是跟交易相关的功能点。例如转账,扣款等接口。如果项目(或功能点)不属于关键业务(或关键业务点)日请求量:确定被测项目各功能点的日请求量(可以统计不同时间粒度下的请求量如:小时,日,周,月)。如果日请求量很高,系统压力很大,而且又是关键业务,该项目需要做性能测试,而且关…

    2022年6月20日
    39
  • 量子搜索算法(Grover Algorithm)

    量子搜索算法(Grover Algorithm)GroverAlgori 一 背景介绍二 具体内涵一 背景介绍遍历搜寻问题的任务是从一个海量元素的无序集合中 找到满足某种要求的元素 要验证给定元素是否满足要求很容易 但反过来查找这些合乎要求的元素则很费事 因为这些元素并没有按要求进行有序的排列 并且数量又很大 在经典算法中 只能按逐个元素试下去 这也正是 遍历搜寻 这一名称的由来 量子计算机比传统计算机具有的众多优势之一是其优越的速度搜索数据库 Grover 的算法证明了这种能力 该算法可以二次加速非结构化搜索问题 但其用途远不止于

    2026年3月17日
    2
  • Redis源码剖析系列博文开篇&大纲

    Redis源码剖析系列博文开篇&大纲今年我启动了好几个比较有挑战的个人项目 比如写一门编程语言 成为一名视频 UP 主 写科幻小说 这些项目目前进度都很堪忧 一方面这些项目挑战都比较大 另一方面业余时间还要忙着吃吃喝喝 追剧 刷综艺 睡懒觉 不过有个项目进度不至于那么不堪 那就是今天的猪脚 Redis 源码剖析 系列博文 今天也是这个系列博文的开篇 为此 我也在 github 上建立了中文注解版的 Redis 源码库 详见 https github com xindoo redis 目前已经添加近 700 行的中文注释 欢迎 Star 和关注

    2026年3月19日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号