【模板】缩点(tarjan,DAG上DP)
题目背景
缩点+DP
题目描述
给定一个n个点m条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大。你只需要求出这个权值和。
允许多次经过一条边或者一个点,但是,重复经过的点,权值只计算一次。
输入输出格式
输入格式:
第一行,n,m
第二行,n个整数,依次代表点权
第三至m+2行,每行两个整数u,v,表示u->v有一条有向边
输出格式:
共一行,最大的点权之和。
思路:
显然,由于点权为正,所以位于一个强连通分量中的结点,自然走得越多答案越大
所以,我们可以跑一边tarjan,将所有的强连通分量染色,建一个新的图
其中新图上的每个结点都代表旧图上的一个强连通分量
在跑tarjan染色的同时我们可以累加得到新图上每个点的点权
最后在新图上跑一边DP或者记忆化搜索即可
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define rii register int i
#define rij register int j
using namespace std;
struct yb{
int from,to;
}y[];
struct ljb{
int to,nxt;
}x[];
int tot,dq[],sta[],sum[],head[],bnt,last[];
int n,m,dfn[],low[],top,cnt,vis[],color[],dp[];
void add(int from,int to)
{
bnt++;
x[bnt].to=to;
if(head[from]==)
{
head[from]=bnt;
}
if(last[from]!=)
{
x[last[from]].nxt=bnt;
}
last[from]=bnt;
}
void search(int wz)
{
if(dp[wz]!=)
{
return;
}
dp[wz]=sum[wz];
int maxn=;
for(rii=head[wz];i!=;i=x[i].nxt)
{
int ltt=x[i].to;
if(dp[ltt]==)
{
search(ltt);
}
maxn=max(maxn,dp[ltt]);
}
dp[wz]+=maxn;
}
void tarjan(int wz)
{
cnt++;
low[wz]=cnt;
dfn[wz]=cnt;
top++;
sta[top]=wz;
vis[wz]=;
for(rii=head[wz];i!=;i=x[i].nxt)
{
int ltt=x[i].to;
if(dfn[ltt]==)
{
tarjan(ltt);
low[wz]=min(low[wz],low[ltt]);
}
else
{
if(vis[ltt]==)
{
low[wz]=min(low[wz],dfn[ltt]);
}
}
}
if(dfn[wz]==low[wz])
{
tot++;
while(sta[top+]!=wz)
{
color[sta[top]]=tot;
sum[tot]+=dq[sta[top]];
vis[sta[top]]=;
top--;
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(rii=;i<=n;i++)
{
scanf("%d",&dq[i]);
}
for(rii=;i<=m;i++)
{
scanf("%d%d",&y[i].from,&y[i].to);
add(y[i].from,y[i].to);
}
for(rii=;i<=n;i++)
{
if(dfn[i]==)
{
tarjan(i);
}
}
/*
for(rii=1;i<=n;i++)
{
printf("%d ",color[i]);
}
cout<<endl;
*/
bnt=;
memset(head,,sizeof(head));
memset(last,,sizeof(last));
memset(x,,sizeof(x));
for(rii=;i<=m;i++)
{
if(color[y[i].from]!=color[y[i].to])
{
add(color[y[i].from],color[y[i].to]);
}
}
int ans=;
for(rii=;i<=n;i++)
{
if(dp[i]==)
{
search(i);
}
ans=max(ans,dp[i]);
}
printf("%d\n",ans);
}
【模板】缩点(tarjan,DAG上DP)的更多相关文章
- bzoj1093: [ZJOI2007]最大半连通子图  scc缩点+dag上dp
		一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v的有向路径或者从v到u的有向路径.若G'=(V ... 
- [正经分析] DAG上dp两种做法的区别——拓扑序与SPFA
		在下最近刷了几道DAG图上dp的题目. 要提到的第一道是NOIP原题<最优贸易>.这是一个缩点后带点权的DAG上dp,它同时规定了起点和终点. 第二道是洛谷上的NOI导刊题目<最长路 ... 
- DAG上dp思想
		DAG上DP的思想 在下最近刷了几道DAG图上dp的题目.要提到的第一道是NOIP原题<最优贸易>.这是一个缩点后带点权的DAG上dp,它同时规定了起点和终点.第二道是洛谷上的NOI导刊题 ... 
- BZOJ5017 [Snoi2017]炸弹[线段树优化建边+scc缩点+DAG上DP/线性递推]
		方法一: 朴素思路:果断建图,每次二分出一个区间然后要向这个区间每个点连有向边,然后一个环的话是可以互相引爆的,缩点之后就是一个DAG,求每个点出发有多少可达点. 然后注意两个问题: 上述建边显然$n ... 
- [CF225C] Barcode (简单DAG上dp)
		题目链接:http://codeforces.com/problemset/problem/225/C 题目大意:给你一个矩阵,矩阵中只有#和.两种符号.现在我们希望能够得到一个新的矩阵,新的矩阵满足 ... 
- bzoj1179: [Apio2009]Atm scc缩点+dag上dp
		先把强连通缩点,然后变成了dag,dp求终点是酒吧的最长路即可, /************************************************************** Pro ... 
- EOJ Monthly 2019.2 E 中位数 (二分+中位数+dag上dp)
		题意: 一张由 n 个点,m 条边构成的有向无环图.每个点有点权 Ai.QQ 小方想知道所有起点为 1 ,终点为 n 的路径中最大的中位数是多少. 一条路径的中位数指的是:一条路径有 n 个点,将这 ... 
- UVA 437 巴比伦塔 【DAG上DP/LIS变形】
		[链接]:https://cn.vjudge.net/problem/UVA-437 [题意]:给你n个立方体,让你以长宽为底,一个个搭起来(下面的立方体的长和宽必须大于上面的长和宽)求能得到的最长高 ... 
- uva 437 巴比伦塔(DAG上dp)
		巴比伦塔 紫书P269 看完紫书,终于可以自己写一个dp了 :) [题目链接]巴比伦塔 [题目类型]DAG上dp &题意: 有n种立方体 n<=30,每种有无穷个,要求选一些立方体摞成一 ... 
随机推荐
- vue支付密码
			从网上搜索了好多都很麻烦,花了点事件自己做了个,简单轻便,老少皆宜 <template> <section class="pay-mask" @click=&qu ... 
- 【热门活动】开年好运开门来!送祝福,赢iPad
			羊年新的云端征程起航,阿里云邀请了众多云上客户给大家送祝福啦,听听他们的寄语,用云计算增强你的竞争力,一起赢在云端! 想赢iPad吗?参与我们的微博活动,和大家一起送上云端祝福,就有机会把iPad带回 ... 
- Android SQLite与AutoCompleteTextView
			读取SQLite中的数据显示在AutoCompleteTextView中,支持动态加入SQLite中不存在的数据. package zhang.ya; import java.io.File; imp ... 
- SSIS ->> Environment Variables
			SQL Server Integration Services(SSIS) 在2012版本引入了Environment Variables这个新特性.它允许我们为一个环境创建出一套变量用于为项目内的包 ... 
- Linux ->> UBuntu 14.04 LTE下安装Hadoop 1.2.1(伪分布模式)
			Hadoop的运行模式可分为单机模式.伪分布模式和分布模式. 首先无论哪种模式都需要安装JDK的,这一步之前的随笔Ubuntu 14.04 LTE下安装JDK 1.8中已经做了.这里就不多说了. 其次 ... 
- Timeout occurred while waiting for latch: class 'COLUMNSTORE_ROWGROUP_COLLECTION'
			今天发现线上数据库主从延迟严重: SELECT ag.name AS ag_name, ar.replica_server_name AS ag_replica_server, dr_state.da ... 
- Eclipse控制台输出信息的控制(引用其他人的博客)
			当你在Eclipse中 running/debugging一个应用程序的时候,有关该应用程序的运行调试信息及日志信息都会输出到控制台(console )显示,但是Eclipse只会显示最后一部分的日志 ... 
- SVNKit学习——Setting Up A Subversion Repository 创建仓库(三)
			所谓Setting Up A Subversion Repository,就是在Subversion所在的服务器上创建一个仓库,说白了就是在磁盘上建一个特殊的目录,这里我以windows举例. 1.使 ... 
- Java SpringMVC学习--基础配置
			快速开始一个基于SpringMVC框架的web项目 开发工具 Eclipse neon.2 运行环境 tomcat8.5 1.在Eclipse中新建一个web项目:File-New-Dynamic W ... 
- 运维不仅仅是懂Linux就行,还需要知道这些……
			运维不仅仅是懂Linux就行,因为还有一大部分的Windows运维,最近看一个报道说,windows的服务器占了47.71%.嗯,向windows运维人员致敬.当然我们这篇文章不是说运维除了懂Linu ... 
