相信来做这道题的人肯定都学过\(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 02 if while

    1. if的格式 >>> 1<3 True 真>>> 1>3False 假 if   条件:                     条件 + : (t ...

  2. 用java编程在10000到99999中的数字中找到aabcc类型的数字

    package com.diyo.offer; public class FindNum { public static void main(String[] args) { int count = ...

  3. Mybatis分页插件: pageHelper的使用及其原理解析

    在实际工作中,很进行列表查询的场景,我们往往都需要做两个步骤:1. 查询所需页数对应数据:2. 统计符合条件的数据总数:而这,又会导致我们必然至少要写2个sql进行操作.这无形中增加了我们的工作量,另 ...

  4. idea 推送jar包到maven私库

    1.推送到本地仓库 idea直接install即可 2.推送到公司私库 2.1 使用配置公司仓库地址的setting文件 <?xml version="1.0" encodi ...

  5. docker-compose 官网下载特别慢怎么办?

    docker compose 官放推荐的下载方式是这样的: sudo curl -L "https://github.com/docker/compose/releases/download ...

  6. javaweb中自己遇到的问题

    1.web中的编码问题 1.1服务器接收的数据 post请求,请求会在Servlet中进行解码,所以我们只需要对request设置UTF-8即可. request.setCharacterEncodi ...

  7. 一台主机的最大TCP连接数是多少?

    在没接触过这个问题之前,自然会想到服务器端连接数是由服务器端口号限制的.但这其实是一个很严重的误解,要解决这个问题,必须理解socket的连接过程. 以python为例,tcp服务端socket需要经 ...

  8. OpenSIPS 2.4.2 高并发下,日志丢失怎么办

      问题年年有,今年特别多.最近公司对呼叫中心平台做了大幅度重构,基于OpenSIPS实现的会话管理服务,在高并发压测过程中,发现OpenSIPS的日志居然出现丢失的情况,简直让我食不知味,困惑不已. ...

  9. e3mall商城总结13之订单确认(有BUG)

    说在前面的话 上一节说了购物车的生成,本节主要说了在购物车的列表上去结算,从而生成一个未支付的订单,生成的订单默认状态为1, 题目说的BUG是因为所有数据都是通过前端向后端生成的,包括订单的金额.因此 ...

  10. Kubernetes实战总结 - 阿里云ECS自建K8S集群

    一.概述 详情参考阿里云说明:https://help.aliyun.com/document_detail/98886.html?spm=a2c4g.11186623.6.1078.323b1c9b ...