题目传送门

Running In The Sky

格式难调,题面就不放了。


  分析:

  一句话题意:给定一张带点权的有向图,求最长点权路径及该路径上的最大点权。

  很明显的$DAGDP$,因此需要缩点,将该图重建为一张$DAG$,在每个强联通分量中记录两个变量$sum,mx$表示该强联通分量中的点权和及最大点权。然后就是$DP$了,因为不仅要求最长点权路径,还要求路径上的最大点权,所以我们可以记录状态$f[x][0]$和$f[x][1]$分别表示以$x$为终点的路径中点权和最大的路径以及该路径上的最大点权。共有两个方程:

$\begin{cases}f[y][0]=f[x][0],f[y][1]=f[x][1] & (f[x][0]>f[y][0])\\f[y][1]=max(f[y][1],f[x][1]) & (f[x][0]==f[y][0]) \end{cases}$

  这样子这题就很好解决了。

  Code:

//It is made by HolseLee on 26th Oct 2018
//Luogu.org P4742
#include<bits/stdc++.h>
using namespace std; const int N=2e5+, M=5e5+;
int n,m,val[N],ans0,ans1,h[N],head[N],cnte,dg[N],f[N][];
int scc[N],mx[N],sum[N],idx,dfn[N],low[N],tot;
bool ins[N];
struct Edge { int to,nxt; }edge[M],e[M];
queue<int>q; stack<int>t; inline int read()
{
char ch=getchar(); int x=; bool flag=false;
while( ch<'' || ch>'' ) {
if( ch=='-' ) flag=true; ch=getchar(); }
while( ch>='' && ch<='' ) {
x=x*+ch-''; ch=getchar(); }
return flag ? -x : x;
} inline void add_edge(int x,int y)
{
edge[++cnte].to=y;
edge[cnte].nxt=h[x];
h[x]=cnte;
} inline void add(int x,int y)
{
e[++cnte].to=y, e[cnte].nxt=head[x];
head[x]=cnte, dg[y]++;
} void tarjan(int x)
{
dfn[x]=low[x]=++idx; ins[x]=; t.push(x);
int y;
for(int i=h[x]; i; i=edge[i].nxt) {
y=edge[i].to;
if( !dfn[y] ) {
tarjan(y);
low[x]=min(low[x],low[y]);
} else if( ins[y] ) {
low[x]=min(low[x],dfn[y]);
}
}
if( dfn[x]==low[x] ) {
++tot;
do {
y=t.top(); t.pop(); ins[y]=false; scc[y]=tot;
sum[tot]+=val[y], mx[tot]=max(mx[tot],val[y]);
} while( y!=x );
}
} void rebuild()
{
cnte=;
for(int x=; x<=n; ++x)
for(int i=h[x],y; i; i=edge[i].nxt) {
y=edge[i].to;
if( scc[x]!=scc[y] ) add(scc[x],scc[y]);
}
} int main()
{
n=read(), m=read();
for(int i=; i<=n; ++i) val[i]=read();
for(int i=; i<=m; ++i) add_edge(read(), read());
for(int i=; i<=n; ++i) if( !dfn[i] ) tarjan(i);
rebuild();
for(int i=; i<=tot; ++i) if( !dg[i] ) q.push(i);
while( !q.empty() ) {
int x=q.front(); q.pop();
f[x][]+=sum[x]; f[x][]=max(f[x][],mx[x]);
for(int i=head[x],y; i; i=e[i].nxt) {
y=e[i].to;
if( !(--dg[y]) ) q.push(y);
if( f[x][]>f[y][] ) {
f[y][]=f[x][], f[y][]=f[x][];
} else if( f[y][]==f[x][] ) {
f[y][]=max(f[y][],f[x][]);
}
}
}
for(int i=; i<=tot; ++i)
if( f[i][]>ans0 ) {
ans0=f[i][], ans1=f[i][];
} else if( f[i][]==ans0 ) {
ans1=max(ans1,f[i][]);
}
printf("%d %d\n",ans0,ans1);
return ;
}

洛谷P4742 [Wind Festival]Running In The Sky [Tarjan缩点,DAGDP]的更多相关文章

  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\)缩点吧,如果没有建议先去做P3387 [模板]缩点,如果你忘了,建议也去看看 满足上面要求后,你会惊奇发现,这两道题基本一样,唯一的差别就是这道题需要记 ...

  3. 「洛谷3469」「POI2008」BLO-Blockade【Tarjan求割点】

    题目链接 [洛谷传送门] 题解 很显然,当这个点不是割点的时候,答案是\(2*(n-1)\) 如果这个点是割点,那么答案就是两两被分开的联通分量之间求组合数. 代码 #include <bits ...

  4. 2019/5/13 洛谷P4742 【tarjan缩点 + 拓扑dp】

    题目链接:https://www.luogu.org/problemnew/show/P4742 题目大意:给一张有向图, 每个点都有点权,第一次经过该点时,该点的点权有贡献,求这张图上一条路径(终点 ...

  5. 洛谷P1353 USACO 跑步 Running

    题目 一道入门的dp,首先要先看懂题目要求. 容易得出状态\(dp[i][j]\)定义为i时间疲劳度为j所得到的最大距离 有两个坑点,首先疲劳到0仍然可以继续疲劳. 有第一个方程: \(dp[i][0 ...

  6. 洛谷 P3119 [USACO15JAN]草鉴定Grass Cownoisseur (SCC缩点,SPFA最长路,枚举反边)

    P3119 [USACO15JAN]草鉴定Grass Cownoisseur 题目描述 In an effort to better manage the grazing patterns of hi ...

  7. 洛谷P2341 [HAOI2006]受欢迎的牛 (Tarjan,SCC缩点)

    P2341 [HAOI2006]受欢迎的牛|[模板]强连通分量 https://www.luogu.org/problem/P2341 题目描述 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就 ...

  8. 洛谷P2863 [USACO06JAN]The Cow Prom S (tarjan)

    题目简述:一个有向图,求出这个图点数>1的强连通分量的个数. 那么就是tarjan求强联通分量的模板了. 记得要用一个数组标记节点是否在栈中. 1 #include<bits/stdc++ ...

  9. 洛谷 1938 [USACO09NOV]找工就业Job Hunt

    洛谷 1938  [USACO09NOV]找工就业Job Hunt 题目描述 Bessie is running out of money and is searching for jobs. Far ...

随机推荐

  1. LANMP环境编译参数查看方法

    nginx编译参数查看:/usr/local/nginx/sbin/nginx -V apache编译参数查看:cat /usr/local/apache2/build/config.nice mys ...

  2. 【洛谷P2114】起床困难综合征 位运算+贪心

    题目大意:给定 N 个操作,每个操作为按位与.或.异或一个固定的数字,现在要求从 0 到 M 中任选一个数字,使得依次经过 N 个操作后的值最大. 题解:位运算有一个重要的性质是:位运算时,无进位产生 ...

  3. C++中this指针

    原文 . this指针的用处: 一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果.this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自 ...

  4. 弹指之间 -- Folk Rock

    CHAPTER 17 民谣摇滚 Folk Rock 以8Beat为主,120左右的速度最能表现此节奏特色. 示例曲目: 略

  5. 设置 Linux 服务器中 MySQL 允许远程访问

    开启 MySQL 远程访问权限: 在linux系统上登陆mysql服务. -- root 是用户名 [root@localhost ~]# mysql -u root -p Enter passwor ...

  6. alloffthelights使用方法

    官网上的demo没有用,因为官网用的jquery是谷歌的CDN,download下来的demo也没有用,因为demo的路径下少了jquery.所以自己写demo的时候要把jquery和alloffth ...

  7. 百度编辑器ueditor 字符限制

    百度编辑器ueditor 字符限制 默认只能输入10000个字符 修改 ueditor.config.js // ,wordCount:true //是否开启字数统计 // ,maximumWords ...

  8. 使用eclipse为Servlet在Tomcat中的部署方法

    一:下载安装jdk,tomcat,eclipse: 使用eclipse建立动态web项目lcj,更改编译文件目录,方法如下: 右键点击→工程名称→属性(Properties)或(Building Pa ...

  9. APK方法数超过65535及MultiDex解决方案

    以下参考自官方文档配置方法数超过 64K 的应用 随着 Android 平台的持续成长,Android 应用的大小也在增加.当您的应用及其引用的库达到特定大小时,您会遇到构建错误,指明您的应用已达到 ...

  10. Android SO文件的兼容和适配

    开发Android应用时,有时候Java层的编码不能满足实现需求,就需要到C/C++实现后生成SO文件,再用System.loadLibrary()加载进行调用,这里成为JNI层的实现.常见的场景如: ...