洛谷 1073 最优贸易 NOIP2009T3 SPFA-程序员宅基地

技术标签: OI刷题  

传送门

坎坷经历(看题解的可略过)

  • 其实这道题还是有点意思的,,,
  • 其实看到这道题我脑子里想的一直是Tarjan缩点然后DAGdp,也不知道能不能做
  • 看了眼题解好吧,,两遍SPFA,都是套路,,,
  • 正经八本地打完SPFA发现不对劲,如果按照常规的SPFA开始加入的节点只有1号点,再加入其它节点时会发生问题,,
  • 正经八本地把所有点都加进去,发现有些点其实是访问不到的,不能用它们更新答案
  • 最后改对了。。

正经的题解

  • 记minn和maxx数组,保存从1开始到x的最小值以及从n开始到x的最大值
  • 把minn数组初始化为INF,maxx初始化为0
  • 从1开始SPFA,把所有能更新的和值为INF的进行更新,注意,先考虑更新INF,在考虑松弛操作
  • 从n开始反向SPFA
  • 注意一下建边的时候要建正向边和反向边
  • 枚举一遍1到n,根据 (maxx[i]minn[i]) 更新ans,输出ans即为结果
#include <cstdio>
#include <cstring>
#include <algorithm>

const int maxm = 2000000 + 50000;
const int maxn = 150000;
int minn[maxn], maxx[maxn];
int last[maxn], pre[maxm], other[maxm], len[maxm];
int tot = 0;
int n, m;
int x, y, z;
int que[maxn], vis[maxn];
int a[maxn];

void add(int x, int y, int z) {
    tot++;
    pre[tot] = last[x];
    last[x] = tot;
    other[tot] = y;
    len[tot] = z;
}

void spfa1(void) {
    que[1] = 1;
    minn[1] = a[1];
    int queh = 0, quet = 1;
    while (queh != quet) {
        queh = (queh + 1) % maxn;
        int cur = que[queh];
        vis[cur] = 0;
        for (int p = last[cur]; p; p = pre[p]) {
            if (len[p] == 2) continue;
            int q = other[p];
            if (minn[q] == 2139062143) {
                minn[q] = a[q];
                vis[q] = 1;
                quet = (quet + 1) % maxn;
                que[quet] = q;
            }
            if (minn[q] > minn[cur]) {
                minn[q] = minn[cur];
                if (!vis[q]) {
                    vis[q] = 1;
                    quet = (quet + 1) % maxn;
                    que[quet] = q;
                }
            }
        }
    } 
}

void spfa2(void) {
    que[1] = n;
    maxx[n] = a[n];
    int queh = 0, quet = 1;
    while (queh != quet) {
        queh = (queh + 1) % maxn;
        int cur = que[queh];
        vis[cur] = 0;
        for (int p = last[cur]; p; p = pre[p]) {
            if (len[p] == 1) continue;
            int q = other[p];
            if (maxx[q] == 0) {
                maxx[q] = a[q];
                quet = (quet + 1) % maxn;
                vis[q] = 1;
                que[quet] = q;
            }
            if (maxx[q] < maxx[cur]) {
                maxx[q] = maxx[cur];
                if (!vis[q]) {
                    vis[q] = 1;
                    quet = (quet + 1) % maxn;
                    que[quet] = q;
                }
            }

        }
    } 
}

int main () {
    scanf("%d %d", &n, &m);
    for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
    for (int i = 1; i <= m; i++) {
        scanf("%d %d %d", &x, &y, &z);
        if (z == 2) {
            add(x, y, 1);
            add(y, x, 1);
            add(x, y, 2);
            add(y, x, 2);
        } else {
            add(x, y, 1);
            add(y, x, 2);
        }
    }
    memset(minn, 127, sizeof(minn));
    memset(maxx, 0, sizeof(maxx));
    spfa1();
    spfa2();
    int ans = 0;
    for (int i = 1; i <= n; i++) {
        ans = std :: max(ans, maxx[i] - minn[i]);
    }
    printf("%d", ans);
    return 0;
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ctsnevermore/article/details/53142813

智能推荐

大象机器人开源六轴协作机械臂myCobot 320 手机摄影技术!

这些问题标志着我后续研究的重点方向,需要我继续深入学习AVFoundation框架的使用,特别是其控制摄像头的具体方法,并探索如何将这些控制整合到机械臂的运动调整中,以确保最终拍摄出的视频质量符合预期。尽管目前市场上有许多稳定设备如平衡环架(gimbal)来辅助拍摄,以求达到稳定和多角度的拍摄效果,但在此篇文章中,我将探索一种独特的解决方案:通过将手机安装在机械臂的末端来进行拍摄,以实现那些传统方法难以捕捉的特殊视角。随着人工智能技术的不断进步和普及,AI与机器人的结合无疑将成为未来技术发展的重要趋势。

【计算机毕业设计】springboot党员之家服务系统小程序-程序员宅基地

文章浏览阅读342次,点赞6次,收藏8次。党员之家服务系统小程序的功能已基本实现,主要包括首页、个人中心、学生管理、教师管理、任务信息管理、报名信息管理、任务排名管理、学习资料管理、每日打卡管理、交流信息管理、回复信息管理、积极分子管理、党员信息管理、交流论坛、系统管理等。论文主要从系统的分析与设计 、数据库设计和系统的详细设计等几个方面来进行论述,系统分析与设计部分主要论述了系统的功能分析、系统的设计思路,数据库设计主要论述了数据库的设计,系统的详细设计部分主要论述了几个主要模块的详细设计过程。

Failed to discover available identity versions when contacting http://controller:35357/v3. 错误解决方式_caused by newconnectionerror('<urllib3.connection.-程序员宅基地

文章浏览阅读8.3k次,点赞5次,收藏12次。作为 admin 用户,请求认证令牌,输入如下命令openstack --os-auth-url http://controller:35357/v3 --os-project-domain-name default --os-user-domain-name default --os-project-name admin --os-username admin token issue报错Failed to discover available identity versions whe._caused by newconnectionerror('

学校机房统一批量安装软件的方法来了_教室电脑 一起装软件-程序员宅基地

文章浏览阅读4.5k次。​可以在桌面安装云顷还原系统软件,利用软件中的网络对拷功能部署批量对拷环境,进行电脑教室软件的批量对拷安装与增量对拷安装。​_教室电脑 一起装软件

消息队列(kafka/nsq等)与任务队列(celery/ytask等)到底有什么不同?_任务队列和消息队列-程序员宅基地

文章浏览阅读3.1k次,点赞5次,收藏7次。原文链接:https://www.ikaze.cn/article/43写这篇博文的起因是,我在论坛宣传我开源的新项目YTask(go语言异步任务队列)时,有小伙伴在下面回了一句“为什么不用nsq?”。这使我想起,我在和同事介绍celery时同事说了一句“这不就是kafka吗?”。那么YTask和nsq,celery和kafka?他们之间到底有什么不同呢?下面我结合自己的理解。简单的分析一..._任务队列和消息队列

Java调KT类_java 调用kt 对象-程序员宅基地

文章浏览阅读1.5k次。1,MyUtuils.kt将被调用的文件class MyUtils { fun show(info:String){ println(info) }}fun show(info:String){ println(info)}2,Java文件调用该类,ClientJava.javapublic class ClientJava { public static void main(String[] args) { /** _java 调用kt 对象

随便推点

论文阅读--Search to Distill

标准的知识蒸馏(KD)方法将笨重的教师模型的知识蒸馏到具有预定义架构的学生模型的参数中。然而,神经网络的知识,即网络在给定输入条件下的输出分布,不仅取决于其参数,还取决于其架构。因此,对于KD的一种更广义的方法是将教师的知识蒸馏到学生的参数和架构中。为了实现这一点,我们提出了一种新的基于架构的知识蒸馏(AKD)方法,该方法找到最适合蒸馏给定教师模型的学生模型(对于教师来说是珍珠)。具体来说,我们利用带有我们的KD引导奖励的神经架构搜索(NAS)来搜索最适合给定教师模型的学生架构。

Docker知识点汇总表格总结

Docker知识比较全面的总结,使用表格总结结合示例,一目了然,运维参考以及面试参考皆可

Matplotlib.pyplot库引入失败?_如何导入 matplotlib.pyplot 导入失败-程序员宅基地

文章浏览阅读174次。用Python的人总少不了与Matplotlib接触,可是我们在引入时Python少不了报错。此时,我们就需要在错误中寻找线索。_如何导入 matplotlib.pyplot 导入失败

uni-app,uni-table表格操作_uniapp table-程序员宅基地

文章浏览阅读8.5k次,点赞2次,收藏11次。使用uni-ui UI框架实现表格加分页功能,uni-table 和uni-pagination 组件的使用示例加完整代码。_uniapp table

HTML5本地存储账号密码

【代码】HTML5本地存储账号密码。

vue.js知识点-transition的钩子函数应用(实例展示)_transition 钩子-程序员宅基地

文章浏览阅读1.6k次。本小结通过transition的钩子函数实现小球半场动画头条-静敏的编程秘诀-vue教程合集知识点1:入场、出厂方法beforeEnter表示动画入场之前,此时,动画尚未开始,可以在beforeEnter中设置元素开始动画之前的起始样式enter表示动画开始之后的样式,这里可是设置小球完成动画之后的,结束状态enter(el,done)el:动画钩子函数的第一个参数:el,..._transition 钩子

推荐文章

热门文章

相关标签