P4742 【[Wind Festival]Running In The Sky】
相信来做这道题的人肯定都学过\(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】的更多相关文章
- T25990 [Wind Festival]Running In The Sky
T25990 [Wind Festival]Running In The Sky 题目背景 [Night - 20:02[Night−20:02 P.M.]P.M.] 夜空真美啊--但是--快要结束了 ...
- 洛谷P4742 [Wind Festival]Running In The Sky [Tarjan缩点,DAGDP]
题目传送门 Running In The Sky 格式难调,题面就不放了. 分析: 一句话题意:给定一张带点权的有向图,求最长点权路径及该路径上的最大点权. 很明显的$DAGDP$,因此需要缩点,将该 ...
- ubuntu14.04 upgrade出现【Ubuntu is running in low-graphics mode】问题的一个解决办法
在ubuntu14.04上安装docker的时候,由于眼花没看清下图这句话: 直接执行了sudo apt-get upgrade命令.然后发生了一个悲剧! 重启后出现下面这个错误! 而且在点击OK进入 ...
- WCF学习系列一【WCF Interview Questions-Part 1 翻译系列】
http://www.topwcftutorials.net/2012/08/wcf-faqs-part1.html WCF Interview Questions – Part 1 This WCF ...
- 【我的Android进阶之旅】 Android Studio插件之Jenkins插件介绍
一Jenkins插件功能介绍 1Jenkins任务列表 2切换Jenkins分组 3构建Jenkins任务 4进入构建Jenkins任务的页面 5进入最后一次构建Jenkins任务的页面 6增加Jen ...
- 【Mac + Appium + Python3.6学习(三)】之IOS自动化测试环境配置
在做这一节之前先配置我的另一篇文章所需要安装的前提准备条件:<[Mac + Appium学习(一)]之安装Appium环境前提准备> 一.安装IOS自动化测试环境 配置环境: Appium ...
- 【LeetCode-面试算法经典-Java实现】【130-Surrounded Regions(围绕区域)】
[130-Surrounded Regions(围绕区域)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given a 2D board containing 'X ...
- Django文件上传【单个/多个图片上传】
准备工作 python:3.6.8 django:2.2.1 新建django项目 确定项目名称.使用的虚拟环境[当然这个也可以后期修改].app的名称 创建成功,选择在新的窗口中打开 图片上传 修改 ...
- 【一起学源码-微服务】Nexflix Eureka 源码十:服务下线及实例摘除,一个client下线到底多久才会被其他实例感知?
前言 前情回顾 上一讲我们讲了 client端向server端发送心跳检查,也是默认每30钟发送一次,server端接收后会更新注册表的一个时间戳属性,然后一次心跳(续约)也就完成了. 本讲目录 这一 ...
随机推荐
- AS 新安装Android Studio运行项目前报错:Unable to access Android SDK add-on list
新安装Android Studio运行项目前报错:Unable to access Android SDK add-on list AS启动后,会在默认路径下检测是否有Android SDK,如果没有 ...
- Eclipse中构建maven项目的两种方式
Eclipse中构建maven项目的两种方式 方式一: 1.构建maven项目 1.1 新建meven项目,可在Other中找到maven文件夹 1.2 进入maven项目后,点击next 1.3 在 ...
- CentOS 安装、配置Nginx反向代理
安装: yum install epel-release yum install nginx 配置: [root@bogon ~]# vim /etc/nginx/conf.d/default.con ...
- 10款人气暴涨的PHP开源工具
若想创建动态而又新颖的Web应用程序,PHP便是理想的选择.不用说,在Web开发世界里,PHP是最流行的语言之一.一些非常好用的PHP开源工具着实拯救了不少开发任务繁重的PHP开发人员,减轻他们的开发 ...
- 手写一个简单版的SpringMVC
一 写在前面 这是自己实现一个简单的具有SpringMVC功能的小Demo,主要实现效果是; 自己定义的实现效果是通过浏览器地址传一个name参数,打印“my name is”+name参数.不使用S ...
- Java高级特性——反射机制(完结)——反射与注解
按照我们的学习进度,在前边我们讲过什么是注解以及注解如何定义,如果忘了,可以先回顾一下https://www.cnblogs.com/hgqin/p/13462051.html. 在学习反射和注解前, ...
- ZERO:新手应该如何学习SEO优化
http://www.wocaoseo.com/thread-325-1-1.html 有一个10000小时理论,说是在各行各业,想成为大师级的人物就要付出10000小时的努力,在SEO这边也是如此. ...
- 2020,最新APP重构:网络请求框架
在现在的app,网络请求是一个很重要的部分,app中很多部分都有或多或少的网络请求,所以在一个项目重构时,我会选择网络请求框架作为我重构的起点.在这篇文章中我所提出的架构,并不是所谓的 最好 的网络请 ...
- 聊一聊RocketMQ的注册中心NameServer
前言 上次我们一起了解了RocketMQ的基本架构原理,那简单的回顾一下RocketMQ的架构组成. RocketMQ其实包含了四个核心部分,NameServer.Broker.Producer.Co ...
- oeasy教您玩转linux010102查看发行版
查看发行版distro 回忆上次内容 从帮助咱们可以知道 name -a 可以得到全部信息 uname -a 从中,咱们知道有ubuntu,他好像是一种发行版. 那么,什么是发行版呢? 什么是发行版?