题目背景

缩点+DP

题目描述

给定一个n个点m条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大。你只需要求出这个权值和。

允许多次经过一条边或者一个点,但是,重复经过的点,权值只计算一次。

输入输出格式

输入格式:

第一行,n,m

第二行,n个整数,依次代表点权

第三至m+2行,每行两个整数u,v,表示u->v有一条有向边

输出格式:

共一行,最大的点权之和。

输入输出样例

输入样例#1: 复制

2 2
1 1
1 2
2 1

输出样例#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 【模板】缩点相关推荐

  1. 强连通分量:洛谷P3387 模板:缩点

    传送门 顾名思义,模板awa #include <cstdio> #include <cstring> #include <cmath> #include < ...

  2. 洛谷 P3387(缩点后+处理 )

    题目链接:https://www.luogu.com.cn/problem/P3387 分析: 我们需要找出一条点权最大的路径. 不限制点的个数,那么对于一个环上的点被选择了,一整条环都应该被选择. ...

  3. 洛谷3387 模板 缩点

    题目:缩点 思路:tarjan缩点+最长路. 注意: 1.用dijkstra求最长路时,优先队列中的<运算符要反过来. 2.需要把所有入度为0的点为起点跑一遍最长路. 3.每次求最长路时,dis ...

  4. [Luogu] P3376 模板-网络流-最大流

    题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点序号.汇点序号. 接下来M行每行 ...

  5. 图论,专为迷途少年而生

    文章目录 目录 图的存储 邻接矩阵 前向星 Topsort P1038 神经网络 P1983 车站分级 最小生成树 MST 堆优化Prim 并查集Kruskal Matrix Tree Theory ...

  6. luogu P3379 【模板】最近公共祖先(LCA)

    lca最近公共祖先,是指两个点最近的祖先节点:求lca我知道的有三种倍增, st表,tarjan,我要介绍的是倍增,我才不会告诉你我只会这一个. 话说我学lca可真的路途曲折,在qbxt,lcy da ...

  7. Tarjan缩点简析

    由于昨天写计蒜客初赛的一道题,看出了是缩点,但一时忘记了另外一个叫什么s...的算法怎么写了,话说我为什么没有回去翻一下自己的blog然后今天就去学了更实用也更强力的Tarjan Tarjan的思想其 ...

  8. tarjan缩点与割点

    Tarjan算法 先是废话时间:说来挺惭愧 , 好几个月以前就学过tarjan算法然而现在才第一次写 模板题:[luogu P3387][模板]缩点 tarjan缩点&dp 为啥要缩点答案显然 ...

  9. Tarjan相关最全(附训练题和答案)

    Tarjan相关最全(附训练题和答案) 算法思想 Tarjan 强连通分量 割点 割桥 缩点 Kosaraju Garbow 训练 POJ2186 POJ1236 POJ2375 Luogu P338 ...

最新文章

  1. c语言将字母与数字分开存放,2017年计算机二级《C语言》考前提分试题及答案9...
  2. 移除VS解决方案中的TFS版本控制
  3. 为安装好的SSAS实例重命名
  4. Arm学习总结之 32位和64位寄存器
  5. 微型计算机断电后信息将会丢失,2011年计算机基础知识精选部分及答案三
  6. 【转】Hadoop API 使用介绍
  7. 全国计算机二级模拟考试软件,全国计算机等级考试模拟考试软件
  8. df 根据文件名找到挂载点原理
  9. 论文-Estimation–Action–Reflection: Towards Deep Interaction Between Conversational and Recommender Sys
  10. Python爬虫随笔
  11. python爬虫(20)获取酷我音乐排行榜榜单作品
  12. Win10 显示无法连接到Internet,但是能上网浏览
  13. 【手机】手机选购指南
  14. js二维数组定义和初始化的三种方法
  15. 基于滴滴云搭建 Ceph 开发环境
  16. ssh隧道-能ssh就能http和tcp,通过ssh就能访问内网web页面和数据库
  17. 重大利好,区块链技术能保护森林资源?
  18. Reids简直存储,key以“\xAC\xED\x00\x05t\x00“开头
  19. python编写程序 计算1_《Python程序设计》——第1章 计算与问题求解简介 1.1 计算与Python简介-阿里云开发者社区...
  20. 项目一 8 购销合同管理,mybatis的逆向生成工具

热门文章

  1. 全局zomm缩放后echarts鼠标偏移的问题(鼠标触发提示框位置有偏差)
  2. 用词袋(bag of word)实现场景识别
  3. 2022 年了,重新理解一波设备驱动 | Linux 驱动
  4. office2016首要事项
  5. office起动缓慢_怎么解决Office2016启动特别慢?
  6. opencv图像全景拼接
  7. Android 屏幕旋转的处理
  8. ARM(IMX6U)裸机之I.MX6ULL启动头文件详解(内部BOOT ROM、IVT + Boot data + DCD + led.bin)
  9. Debug:‘boost::this_thread‘ has not been declared; undefined reference to ‘boost::this_thread...‘
  10. 为什么有全连接层的卷积网络输入图片尺寸需要固定的