Luogu P3387 【模板】缩点
题目背景
缩点+DP
题目描述
给定一个n个点m条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大。你只需要求出这个权值和。
允许多次经过一条边或者一个点,但是,重复经过的点,权值只计算一次。
输入输出格式
输入格式:
第一行,n,m
第二行,n个整数,依次代表点权
第三至m+2行,每行两个整数u,v,表示u->v有一条有向边
输出格式:
共一行,最大的点权之和。
输入输出样例
2 2 1 1 1 2 2 1
2
说明
n<=10^4,m<=10^5,点权<=1000
算法:Tarjan缩点+DAGdp
1 //2018年4月30日17:48:17 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 using namespace std; 6 7 const int N = 100001; 8 const int M = 500001; 9 10 int n, m, w[N], ans; 11 12 int fir[N], to[M], nxt[M], edge_num; 13 void addEdge(int x, int y){ 14 to[++edge_num] = y; 15 nxt[edge_num] = fir[x]; 16 fir[x] = edge_num; 17 } 18 19 int dfn[N], low[N], stack[N], top, instack[N], tim, col_num, color[N], sum[N]; 20 void Tarjan(int x){ 21 low[x] = dfn[x] = ++tim; 22 stack[++top] = x; 23 instack[x] = 1; 24 for(int i=fir[x]; i; i=nxt[i]){ 25 int v = to[i]; 26 if(!dfn[v]){ 27 Tarjan(v); 28 low[x] = min(low[x], low[v]); 29 }else if(instack[v]){ 30 low[x] = min(low[x], dfn[v]); 31 } 32 } 33 if(low[x] == dfn[x]){ 34 col_num++; 35 while(1){ 36 int now = stack[top--]; 37 instack[now] = 0; 38 color[now] = col_num; 39 sum[col_num] += w[now]; 40 if(now == x) break; 41 } 42 } 43 } 44 45 int dp[N]; 46 47 int dfs(int u){ 48 if(dp[u]) return dp[u]; 49 dp[u] = sum[u]; 50 int mx = 0; 51 for(int i=fir[u]; i; i=nxt[i]){ 52 int v = to[i]; 53 if(!dp[v]) dfs(v); 54 if(dp[v] > mx) mx = dp[v]; 55 } 56 dp[u] += mx; 57 return dp[u]; 58 } 59 60 int main(){ 61 scanf("%d%d", &n, &m); 62 for(int i=1; i<=n; i++) 63 scanf("%d", &w[i]); 64 int x[N], y[N]; 65 for(int i=1; i<=m; i++){ 66 scanf("%d%d", &x[i], &y[i]); 67 addEdge(x[i], y[i]); 68 } 69 for(int i=1; i<=n; i++) 70 if(!dfn[i]) 71 Tarjan(i); 72 memset(fir, 0, sizeof(fir)); 73 memset(to, 0, sizeof(to)); 74 memset(nxt, 0, sizeof(nxt)); 75 edge_num = 0; 76 for(int i=1; i<=m; i++) 77 if(color[x[i]] != color[y[i]]) 78 addEdge(color[x[i]], color[y[i]]); 79 for(int i=1; i<=col_num; i++) 80 if(!dp[i]){ 81 dfs(i); 82 ans = max(ans, dp[i]); 83 } 84 printf("%d\n", ans); 85 86 return 0; 87 }
转载于:https://www.cnblogs.com/sineagle/p/8974235.html
Luogu P3387 【模板】缩点相关推荐
- 强连通分量:洛谷P3387 模板:缩点
传送门 顾名思义,模板awa #include <cstdio> #include <cstring> #include <cmath> #include < ...
- 洛谷 P3387(缩点后+处理 )
题目链接:https://www.luogu.com.cn/problem/P3387 分析: 我们需要找出一条点权最大的路径. 不限制点的个数,那么对于一个环上的点被选择了,一整条环都应该被选择. ...
- 洛谷3387 模板 缩点
题目:缩点 思路:tarjan缩点+最长路. 注意: 1.用dijkstra求最长路时,优先队列中的<运算符要反过来. 2.需要把所有入度为0的点为起点跑一遍最长路. 3.每次求最长路时,dis ...
- [Luogu] P3376 模板-网络流-最大流
题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点序号.汇点序号. 接下来M行每行 ...
- 图论,专为迷途少年而生
文章目录 目录 图的存储 邻接矩阵 前向星 Topsort P1038 神经网络 P1983 车站分级 最小生成树 MST 堆优化Prim 并查集Kruskal Matrix Tree Theory ...
- luogu P3379 【模板】最近公共祖先(LCA)
lca最近公共祖先,是指两个点最近的祖先节点:求lca我知道的有三种倍增, st表,tarjan,我要介绍的是倍增,我才不会告诉你我只会这一个. 话说我学lca可真的路途曲折,在qbxt,lcy da ...
- Tarjan缩点简析
由于昨天写计蒜客初赛的一道题,看出了是缩点,但一时忘记了另外一个叫什么s...的算法怎么写了,话说我为什么没有回去翻一下自己的blog然后今天就去学了更实用也更强力的Tarjan Tarjan的思想其 ...
- tarjan缩点与割点
Tarjan算法 先是废话时间:说来挺惭愧 , 好几个月以前就学过tarjan算法然而现在才第一次写 模板题:[luogu P3387][模板]缩点 tarjan缩点&dp 为啥要缩点答案显然 ...
- Tarjan相关最全(附训练题和答案)
Tarjan相关最全(附训练题和答案) 算法思想 Tarjan 强连通分量 割点 割桥 缩点 Kosaraju Garbow 训练 POJ2186 POJ1236 POJ2375 Luogu P338 ...
最新文章
- c语言将字母与数字分开存放,2017年计算机二级《C语言》考前提分试题及答案9...
- 移除VS解决方案中的TFS版本控制
- 为安装好的SSAS实例重命名
- Arm学习总结之 32位和64位寄存器
- 微型计算机断电后信息将会丢失,2011年计算机基础知识精选部分及答案三
- 【转】Hadoop API 使用介绍
- 全国计算机二级模拟考试软件,全国计算机等级考试模拟考试软件
- df 根据文件名找到挂载点原理
- 论文-Estimation–Action–Reflection: Towards Deep Interaction Between Conversational and Recommender Sys
- Python爬虫随笔
- python爬虫(20)获取酷我音乐排行榜榜单作品
- Win10 显示无法连接到Internet,但是能上网浏览
- 【手机】手机选购指南
- js二维数组定义和初始化的三种方法
- 基于滴滴云搭建 Ceph 开发环境
- ssh隧道-能ssh就能http和tcp,通过ssh就能访问内网web页面和数据库
- 重大利好,区块链技术能保护森林资源?
- Reids简直存储,key以“\xAC\xED\x00\x05t\x00“开头
- python编写程序 计算1_《Python程序设计》——第1章 计算与问题求解简介 1.1 计算与Python简介-阿里云开发者社区...
- 项目一 8 购销合同管理,mybatis的逆向生成工具
热门文章
- 全局zomm缩放后echarts鼠标偏移的问题(鼠标触发提示框位置有偏差)
- 用词袋(bag of word)实现场景识别
- 2022 年了,重新理解一波设备驱动 | Linux 驱动
- office2016首要事项
- office起动缓慢_怎么解决Office2016启动特别慢?
- opencv图像全景拼接
- Android 屏幕旋转的处理
- ARM(IMX6U)裸机之I.MX6ULL启动头文件详解(内部BOOT ROM、IVT + Boot data + DCD + led.bin)
- Debug:‘boost::this_thread‘ has not been declared; undefined reference to ‘boost::this_thread...‘
- 为什么有全连接层的卷积网络输入图片尺寸需要固定的