相信来做这道题的人肯定都学过\(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. python 去除Excel中的重复行数据

    导入pandas import pandas as pd 1.读取excel中的数据: frame = pd.DataFrame(pd.read_csv('excel的绝对路径.csv'', 'She ...

  2. java应用中的日志介绍

    日志在应用程序中是非常非常重要的,好的日志信息能有助于我们在程序出现 BUG 时能快速进行定位,并能找出其中的原因. 但是,很多介绍 AOP 的地方都采用日志来作为介绍,实际上日志要采用切面的话是极其 ...

  3. SpringMVC+Spring+mybatis+maven+搭建多模块框架前后端分离开发框架的完整demo,拿走不谢。——猿实战02

            猿实战是一个原创系列文章,通过实战的方式,采用前后端分离的技术结合SpringMVC Spring Mybatis,手把手教你撸一个完整的电商系统,跟着教程走下来,变身猿人找到工作不是 ...

  4. linux驱动之内核多线程(四)

    本文摘自 http://www.cnblogs.com/zhuyp1015/archive/2012/06/13/2548494.html 自己创建的内核线程,当把模块加载到内核之后,可以通过:ps ...

  5. Revisiting Fundamentals of Experience Replay

    郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! ICML 2020 Abstract 经验回放对于深度RL中的异策算法至关重要,但是在我们的理解上仍然存在很大差距.因此,我们对Q学习方法 ...

  6. Spark SQL dropDuplicates

    spark sql 数据去重 在对spark sql 中的dataframe数据表去除重复数据的时候可以使用dropDuplicates()方法 dropDuplicates()有4个重载方法 第一个 ...

  7. 前端防止xxs注入

    思路:        去掉所有跟sql有关的标签: $(function () { $(":input").change(function () { // alert($(this ...

  8. Android开发之常用必备工具类图片bitmap转成字符串string与String字符串转换为bitmap图片格式

    作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 QQ986945193 博客园主页:http://www.cnblogs.com/mcxiaobing ...

  9. springBoot整合spring security+JWT实现单点登录与权限管理--筑基中期

    写在前面 在前一篇文章当中,我们介绍了springBoot整合spring security单体应用版,在这篇文章当中,我将介绍springBoot整合spring secury+JWT实现单点登录与 ...

  10. 基于django快速开发一个网站(一)

    基于django快速开发一个网站(一) *  创建虚拟环境.基于虚拟环境创建django==2.0.0和图片加载库和mysql数据库驱动 1. 创建目录并创建虚拟环境 ╰$ mkdir Cornuco ...