相信来做这道题的人肯定都学过\(Tarjan\)缩点吧,如果没有建议先去做P3387 【模板】缩点,如果你忘了,建议也去看看

满足上面要求后,你会惊奇发现,这两道题基本一样,唯一的差别就是这道题需要记录最大点权,比模板题多一个要求

但其实这很好想,在缩点的时候,我们另开一个数组记录每一个缩点之后的最值,其余部分完全一样。至于程序我就不贴了

然后就是跑最大值,其实就是跑最长路,我们可以使用拓扑,记忆化搜索或者DP,但是之前做的时候用的是拓扑,这里就只说拓扑的做法

我们用\(dis\)表示到达该点时的最长路,\(maxn\)表示到达该点的最长路上的最大点权

在拓扑跑最长路的过程中,每更新一次最长路,就意味着这条最长路发生了改变,所以这个时候我们应当把\(maxn\)清空,重新更新一次最大点权,不然就会出错,在最后更新答案时,也要注意这个地方

#include <bits/stdc++.h>
using namespace std;
int n,m,ti,cnt,top,tot,ans=-99999999,sum,a[5000010],q[5000010],in[5000010],dis[5000010],pre[5000010],poi[5000010];
int dfn[5000010],low[5000010],vis[5000010],num[5000010],fir[5000010],head[5000010],heads[5000010],maxn[5000010];
int x[5000010],y[5000010]; struct node {
int to,net;
} e[5000010],es[5000010]; void add(int u,int v) {
e[++tot].to=v;
e[tot].net=head[u];
head[u]=tot;
} void adds(int u,int v) {
es[++tot].to=v;
es[tot].net=heads[u];
heads[u]=tot;
} void tarjan(int x) {
vis[x]=1;
q[++top]=x;
dfn[x]=low[x]=++ti;
for(int i=head[x];i;i=e[i].net) {
int v=e[i].to;
if(!dfn[v]) {
tarjan(v);
low[x]=min(low[x],low[v]);
}
else {
if(vis[v]) low[x]=min(low[x],dfn[v]);
}
}
if(low[x]==dfn[x]) {
++cnt;
while(q[top+1]!=x) {
vis[q[top]]=0;
fir[q[top]]=cnt;
num[cnt]+=a[q[top]];
poi[cnt]=max(poi[cnt],a[q[top]]); //记录缩完点之后的最大点权
top--;
}
}
} inline void topo() {
queue<int> q;
for(register int i=1;i<=cnt;i++) {
dis[i]=num[i];
maxn[i]=poi[i];
if(!in[i]) q.push(i);
} //记得初始化
while(!q.empty()) {
int xx=q.front();
q.pop();
for(register int i=heads[xx];i;i=es[i].net) {
int v=es[i].to;
if(dis[xx]+num[v]>dis[v]) { //更新最大边权之和
maxn[v]=0; //记得清空,因为更换了路径
maxn[v]=max(poi[v],maxn[xx]);
dis[v]=dis[xx]+num[v];
}else if(dis[xx]+num[v]==dis[v]){
maxn[v]=max(maxn[v],maxn[xx]);
}//注意判断边权相同的情况,此时点权可能更大
if(--in[v]==0) q.push(v);
}
}
} 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",&x[i],&y[i]);
add(x[i],y[i]);
}
for(int i=1;i<=n;i++) {
if(!dfn[i]) tarjan(i);
}
tot=0;
for(int i=1;i<=m;i++) {
if(fir[x[i]]!=fir[y[i]]){
adds(fir[x[i]],fir[y[i]]);
++in[fir[y[i]]];
}
}
topo();
for(int i=1;i<=cnt;i++) {
if(ans<dis[i]) {
ans=dis[i];
sum=0; //这个地方我最开始一直没考虑到(但是边权我却改了),95分调了很久
sum=max(sum,maxn[i]);
}else if(ans==dis[i]){
ans=dis[i];
sum=max(sum,maxn[i]);
}//和上面topo一样的思路
}
printf("%d %d",ans,sum);
return 0;
}

P4742 【[Wind Festival]Running In The Sky】的更多相关文章

  1. T25990 [Wind Festival]Running In The Sky

    T25990 [Wind Festival]Running In The Sky 题目背景 [Night - 20:02[Night−20:02 P.M.]P.M.] 夜空真美啊--但是--快要结束了 ...

  2. 洛谷P4742 [Wind Festival]Running In The Sky [Tarjan缩点,DAGDP]

    题目传送门 Running In The Sky 格式难调,题面就不放了. 分析: 一句话题意:给定一张带点权的有向图,求最长点权路径及该路径上的最大点权. 很明显的$DAGDP$,因此需要缩点,将该 ...

  3. ubuntu14.04 upgrade出现【Ubuntu is running in low-graphics mode】问题的一个解决办法

    在ubuntu14.04上安装docker的时候,由于眼花没看清下图这句话: 直接执行了sudo apt-get upgrade命令.然后发生了一个悲剧! 重启后出现下面这个错误! 而且在点击OK进入 ...

  4. WCF学习系列一【WCF Interview Questions-Part 1 翻译系列】

    http://www.topwcftutorials.net/2012/08/wcf-faqs-part1.html WCF Interview Questions – Part 1 This WCF ...

  5. 【我的Android进阶之旅】 Android Studio插件之Jenkins插件介绍

    一Jenkins插件功能介绍 1Jenkins任务列表 2切换Jenkins分组 3构建Jenkins任务 4进入构建Jenkins任务的页面 5进入最后一次构建Jenkins任务的页面 6增加Jen ...

  6. 【Mac + Appium + Python3.6学习(三)】之IOS自动化测试环境配置

    在做这一节之前先配置我的另一篇文章所需要安装的前提准备条件:<[Mac + Appium学习(一)]之安装Appium环境前提准备> 一.安装IOS自动化测试环境 配置环境: Appium ...

  7. 【LeetCode-面试算法经典-Java实现】【130-Surrounded Regions(围绕区域)】

    [130-Surrounded Regions(围绕区域)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given a 2D board containing 'X ...

  8. Django文件上传【单个/多个图片上传】

    准备工作 python:3.6.8 django:2.2.1 新建django项目 确定项目名称.使用的虚拟环境[当然这个也可以后期修改].app的名称 创建成功,选择在新的窗口中打开 图片上传 修改 ...

  9. 【一起学源码-微服务】Nexflix Eureka 源码十:服务下线及实例摘除,一个client下线到底多久才会被其他实例感知?

    前言 前情回顾 上一讲我们讲了 client端向server端发送心跳检查,也是默认每30钟发送一次,server端接收后会更新注册表的一个时间戳属性,然后一次心跳(续约)也就完成了. 本讲目录 这一 ...

随机推荐

  1. 文章目录&友情链接

    文章目录&友情链接 1:<公告:本博客开始写博文了> 2.本人网络图书馆

  2. node.js03 第一个node.js程序和读取文件

    Hello World 1.创建运行 创建txt文件起名为hellonode,在记事本中编写JavaScript脚本文件 例如: var bbl = 'hellonode' console.log(b ...

  3. 第5篇 Scrum 冲刺博客

    1.站立会议 照骗 进度 成员 昨日完成任务 今日计划任务 遇到的困难 钟智锋 完成技能 完全重构游戏逻辑代码,并编写调试模块 队友的代码已经和想法相去甚远 庄诗楷 制作了开始游戏的界面 进行了相关的 ...

  4. 问卷星的数据导入spss后变量乱码如何处理?

    一般是字符编码问题.打开一个空的SPSS数据集,选择[编辑]-[选项]-[常规]-[数据和语法的字符编码].修改下当前的编码系统,原来是第一种就换成第二种,原来是第二种就换成第一种,打开一个数据再看看 ...

  5. MySQL添加外键报错 - referencing column 'xx' and referenced column 'xx' in foreign key constraint 'xx' are incompatible

    MySQL给两个表添加外键时,报错 翻译意思是:外键约束“xx”中的引用列“xx”和引用列“xx”不兼容 说明两个表关联的列数据类型不一致,比如:varchar 与 int,或者 int无符号 与 i ...

  6. 一文带你深扒ClassLoader内核,揭开它的神秘面纱!

    「MoreThanJava」 宣扬的是 「学习,不止 CODE」. 如果觉得 「不错」 的朋友,欢迎 「关注 + 留言 + 分享」,文末有完整的获取链接,您的支持是我前进的最大的动力! 前言 Clas ...

  7. 力扣Leetcode 572. 另一个树的子树

    另一个树的子树 给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树.s 的一个子树包括 s 的一个节点和这个节点的所有子孙.s 也可以看做它自身的一棵子树. 示例 ...

  8. 力扣Leetcode 199. 二叉树的右视图

    199. 二叉树的右视图 给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值. 示例: 输入: [1,2,3,null,5,null,4] 输出: [1, 3, ...

  9. 洛谷 P3177 [HAOI2015]树上染色 树形DP

    洛谷 P3177 [HAOI2015]树上染色 树形DP 题目描述 有一棵点数为 \(n\) 的树,树边有边权.给你一个在 \(0 \sim n\)之内的正整数 \(k\) ,你要在这棵树中选择 \( ...

  10. 如何解读 Java IO、NIO 中的同步阻塞与同步非阻塞?

    原文链接:如何解读 Java IO.NIO 中的同步阻塞与同步非阻塞? 一.前言 最近刚读完一本书:<Netty.Zookeeper.Redis 并发实战>,个人觉得 Netty 部分是写 ...