【模板】缩点 tarjan+dp 原创 fish04 2022-05-27 20:27:40 博主文章分类:dp ©著作权 文章标签 #include #define i++ 文章分类 后端开发 ©著作权归作者所有:来自51CTO博客作者fish04的原创作品,请联系作者获取转载授权,否则将追究法律责任 题目背景缩点+DP题目描述给定一个n个点m条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大。你只需要求出这个权值和。允许多次经过一条边或者一个点,但是,重复经过的点,权值只计算一次。输入输出格式输入格式:第一行,n,m第二行,n个整数,依次代表点权第三至m+2行,每行两个整数u,v,表示u->v有一条有向边输出格式:共一行,最大的点权之和。输入输出样例输入样例#1:复制2 21 11 22 1输出样例#1: 复制2说明n<=10^4,m<=10^5,点权<=1000算法:Tarjan缩点+DAGdp Tarjan+记忆化搜索;缩点以后,重新建图,然后dp;#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include//#include//#pragma GCC optimize(2)using namespace std;#define maxn 400005#define inf 0x7fffffff//#define INF 1e18#define rdint(x) scanf("%d",&x)#define rdllt(x) scanf("%lld",&x)#define rdult(x) scanf("%lu",&x)#define rdlf(x) scanf("%lf",&x)#define rdstr(x) scanf("%s",x)typedef long long ll;typedef unsigned long long ull;typedef unsigned int U;#define ms(x) memset((x),0,sizeof(x))const long long int mod = 1e9 + 7;#define Mod 1000000000#define sq(x) (x)*(x)#define eps 1e-3typedef pair pii;#define pi acos(-1.0)const int N = 1005;#define REP(i,n) for(int i=0;i<(n);i++)typedef pair pii;inline ll rd() { ll x = 0; char c = getchar(); bool f = false; while (!isdigit(c)) { if (c == '-') f = true; c = getchar(); } while (isdigit(c)) { x = (x << 1) + (x << 3) + (c ^ 48); c = getchar(); } return f ? -x : x;}ll gcd(ll a, ll b) { return b == 0 ? a : gcd(b, a%b);}ll sqr(ll x) { return x * x; }/*ll ans;ll exgcd(ll a, ll b, ll &x, ll &y) { if (!b) { x = 1; y = 0; return a; } ans = exgcd(b, a%b, x, y); ll t = x; x = y; y = t - a / b * y; return ans;}*/int n, m;int idx;int col[maxn], dp[maxn], sum[maxn];int head[maxn];int sk[maxn], top;int dfn[maxn], low[maxn];int tot;int vis[maxn];int val[maxn];struct node { int u, v, nxt;}edge[maxn];int cnt;void addedge(int x, int y) { edge[++cnt].v = y; edge[cnt].nxt = head[x]; head[x] = cnt;}void tarjan(int x) { sk[++top] = x; vis[x] = 1; low[x] = dfn[x] = ++idx; for (int i = head[x]; i; i = edge[i].nxt) { int v = edge[i].v; if (!dfn[v]) { tarjan(v); low[x] = min(low[x], low[v]); } else if (vis[v]) { low[x] = min(low[x], dfn[v]); } } if (dfn[x] == low[x]) { tot++; while (sk[top + 1] != x) { col[sk[top]] = tot; sum[tot] += val[sk[top]]; vis[sk[top--]] = 0; } }}void DP(int x) { int maxx = 0; if (dp[x])return; dp[x] = sum[x]; for (int i = head[x]; i; i = edge[i].nxt) { int v = edge[i].v; if (!dp[v])DP(v); maxx = max(maxx, dp[v]); } dp[x] += maxx;}int x[maxn], y[maxn];int main(){ //ios::sync_with_stdio(0); rdint(n); rdint(m); for (int i = 1; i <= n; i++)rdint(val[i]); for (int i = 1; i <= m; i++) { rdint(x[i]); rdint(y[i]); addedge(x[i], y[i]); } for (int i = 1; i <= n; i++)if (!dfn[i])tarjan(i); ms(edge); cnt = 0; ms(head); for (int i = 1; i <= m; i++) { if (col[x[i]] != col[y[i]]) { addedge(col[x[i]], col[y[i]]); } } int ans = 0; for (int i = 1; i <= tot; i++) { if (!dp[i]) { DP(i); ans = max(ans, dp[i]); } } cout << ans << endl; return 0;} EPFL - Fighting 赞 收藏 评论 分享 举报 上一篇:小B的询问 莫队分块 下一篇:有趣的数 zoj 月赛 提问和评论都可以,用心的回复会被更多人看到 评论 发布评论 全部评论 () 最热 最新 相关文章 Linux磁盘精准缩容:操作详解与技巧 Linux磁盘精准缩容:操作详解与技巧引言在Linux系统管理中,有效的磁盘空间优化对于维护系统性能至关重要。本文将深入探讨如何在Linux环境下安全地进行磁盘缩容,帮助你合理调整存储资源,确保系统高效运行。跟随本篇的步骤,一起优化你的Linux系统磁盘空间!磁盘缩容的理论基础磁盘缩容,即缩小磁盘分区的大小,是一个复杂但常见的运维操作。它允许管理员在不丢失数据的情况下释放或重新分配磁盘空间。然而, 逻辑卷 文件系统 磁盘 缩容 Linux Springboot(三)——Thymeleaf模板 Springboot(三)——Thymeleaf模板内容回顾:1.springboot基本配置;2.springboot整合mybatis开发web项目本章重点:1.什么thymeleaf模板2.使用thymeleaf完全前台页面操作一、Thymeleaf介绍Thymeleaf是一个全新得模板引擎,可以用来替代jsp页面。是spring4推荐使用得一个模板引擎。特点:1.Thy html spring 赋值 无涯教程-ExpressJS - 模板(Templating) Pug是Express的模板引擎,Pug是一个非常强大的模板引擎,具有多种函数,包括filter,includes,inheritan... expressjs 【模板】缩点 题目背景 缩点+DP 题目描述 给定一个n个点m条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大。你只需要求出这个权值和。 允许多次经过一条边或者一个点,但是,重复经过的点,权值只计算一次。 输入输出格式 输入格式: 第一行,n,m 第二行,n个整数,依次代表点权 第三至m+2行 #include i++ 权值 其他 tarjan【模板】缩点 传送门:https://www.luogu.org/problemnew/show/P3387 首先呢,tarjan找一个图的强连通分量是基于对图的dfs的。这中间开了一个dfn[]代表dfs序,还有个low[]代表该节点在dfs形成的树中能到达的最近的根。然后分情况进行更新(一会儿看我代码吧)。 编程开发 C 教程 Tarjan缩点 Tarjan缩点或许更好的阅读体验P3387 【模板】缩点思路既然时缩点的模板,那么缩点自然少不了了,缩点后我们的到新的有向无环图,然后再利用这个无环图去找一条最大权值的路径,路径和即为答案。我们改如何选取起点来避免不必要的计算,假设存在一条路径,我们的最大值一定时从起点开始的,所以我们选取所有的缩点以后入度为零的点去bfs,然后不断更新最大路径值。代码#include <bits/stdc++.h>using namespace std;typedef long long i++ #include 缩点 强连通分量 c++ 模板整理: 图论---tarjan缩点/桥/割点 tarjan这算法没学好……气哦 目前掌握得还可以的只有缩点, 每次桥和割点只能手推。。还总是推错。 说实话也没什么难的啊。。 缩点,桥u, 强连通分量 缩点 时间戳 【nowcoder 通知小弟】(tarjan缩点) 链接:https://www.nowcoder.com/acm/contest/76/E 来源:牛客网时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64bit IO Format: %lld 题目描述 在战争时期,A国派出了许多间谍到其他国家去收集情报。因为间谍需要隐秘自己的身份,所以他们之间只是单向联系。所以,... NowCoder ACM_连通图 tarjan缩点 nowcoder 经验分享 POJ 1236 Tarjan缩点及思维.. 题意是有N个学校...每个学校可能向几个学校进行数据传输(单向的)...问 i++ #include tarjan缩点 POJ 2186 Popular Cows——Tarjan缩点 题意:有n头牛,m个崇拜关系,并且崇拜具有传递性 #include i++ 强联通分量 wannafly14C(tarjan缩点) 显然能够想到的是入度为0的一定要加的。。然后就剩下环了。。环处理很容易想到 ━ ┃ * ┃ > #define #include 点集 【POJ - 2186】Popular Cows (Tarjan缩点) 题干:Every cow's dream is to become the most popular cow in the herd. In a herd of hat... #include i++ #define tarjan+缩点 B -Popular CowsTime Limit:2000MSMemory Limit:65536KB64bit IO Format:%I64d & %I64uSubmitStatusDescriptionEvery cow's dream is to become the most popula... i++ #include ide 缩点 邻接表 UVa11324 - The Largest Clique(Tarjan缩点+dp) 题目链接分析: 不强制双向到达,求最大团 显然一个强连通分量中的点要么都选,要么都不选 我们可以用Tarjan把强连通分量缩点得到SCC图 SCC图中每一个点的权值就是这个SCC中点的数量 问题就转化成, 在图中选择若干个点使得权值和最大 求SCC图中的最大权路径由于... #include i++ 强连通分量 权值 缩点 tarjan缩点模版(复习 第一次写缩点是用vector存边,因此现在用链前存边再写一遍 传送门:P3387 【模板】缩点 题意分析 (1)很容易发现,由于每一个点可以被经过多次,那么同一个强连通分量中的每一个点都可以互相到达,因此可以看作一个点。 (2)缩点后,整张图一定变成了一个DAG 证明:反证即可,假设不是DAG,则有 ... 缩点 强连通分量 最长路 拓扑排序 #include tarjan求强连通分量+缩点 模板 #define N 100100#define M 200200int n,m;int id,index; //id表示缩点后点的id,index表示进行tarjan算法时访问的点先后int vis[N],low[N]; //vis表示到当前点的时间,low表示当前所能到达的最小时间.int stk[N],top; //表示栈int mark[N];int link[N]; //将点与缩点后的点相连.int sum[N]; //强连通分量中点的个数void dfs(int tarjan_s){ vis[tarjan_s]=++index; low[tarjan_s]=vis[tar... #define 强连通分量 缩点 i++ 强连通 图论--SCC缩点--Tarjan // Tarjan算法求有向图强连通分量并缩点/*强连通缩点与双连通缩点大同小异,也就是说将强连通分支缩成一个点之后,没有强连通,成为有向无环图,在对图进行题目的操作。*/#include#include#inc... #include 缩点 i++ 有向无环图 强连通分量 Tarjan(缩点等) 板子 割点/割边 void dfs(int x, int fa) { dfn[x] = low[x] = ++ tot; for(unsigned int i = 0; i < v[x].size(); i ++) { int Y = v[x][i]; if(Y == fa) continue; if(! ... 割边 强连通 割点 缩点 JAVA 1827 tarjan+缩点 #include#include#include#include#include#includeusing namespace std;#define inf 1000000000#define N 2100vectorh[N];//stackq;///int dfn[N],low[N],index... #include i++ 缩点 #define 初始化 BZOJ 2427 /HAOI 2010 软件安装 tarjan缩点+树形DP 终于是道中文题了。。。。 当时考试的时候就考的这道题。。。。 果断GG。 思路: 因为有可能存在依赖环,所以呢 先要tarjan一遍 来缩点。 随后就进行一遍树形DP就好了。。 x表示当前的节点。j表示j的空间最多能放多少价值的软件。 状态转移方程:f[x][j]=max(f[x... i++ #include 树形dp 缩点 状态转移 java项目话术怎么写 一、内存与线程1、内存结构内存是计算机的重要部件之一,它是外存与CPU进行沟通的桥梁,计算机中所有程序的运行都在内存中进行,内存性能的强弱影响计算机整体发挥的水平。JVM的内存结构规定Java程序在执行时内存的申请、划分、使用、回收的管理策略,通说来说JVM的内存管理指运行时数据区这一大块的管理。业界常用的服务注册与发现组件对比了解服务注册与发现的基本原理后,如果你要在项目中使用服务注册与发现组件 java项目话术怎么写 java 经验分享 面试 数据中心 ios 修改tableView的contentOffset的值小于0时会一直触发scrollViewDidScroll 2013-5-261. 可访问性不一致,参数类型***比方法***的访问性低这样的情形出现的情况往往是在方法中操作一个类对象,而该类的访问修饰符非Public,只需要将其访问修饰符改为Public即可。2. table边框单元格效果上周开发遇到的一个小问题,就是动态的显示一个table时,需要为其加上边框,每个单元格都需要有边框,只是一个很简单的CSS样式而已,代码如下:<style typ Test ci 表名 python 彷射变换矩阵 在Python的OpenCV库中,仿射变换是一种对图像进行几何变换的方法。它通过应用线性变换和平移变换来改变图像的形状、大小和位置。仿射变换可以使用cv2.getAffineTransform()函数计算仿射变换矩阵,然后使用cv2.warpAffine()函数将变换矩阵应用于图像。下面是仿射变换的实现过程的数学原理: 1、选择三个点:在进行仿射变换之前,我们需要选择原始图像中的三个点和目标图像中 python 彷射变换矩阵 opencv 计算机视觉 人工智能 仿射变换 python plot x轴 Python+Matplotlib解决X 轴值不按数组排序最简单的办法问题描述解决方案复制害死人最终解决 问题描述看标题就知道了,先上个图给大家 这个图对应的代码和数据如下,也是网上找到的最初的代码,根据自己的数据进行了略微改动,也是最简单的办法,让你会感觉plt的使用简直是太简单了。# 折线图 plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来 python plot x轴 python matplotlib 数据 解决方案 python pyzbar decode是空 文章目录介绍安装语法语法规则举例说明在 python 中使用获取所有结构所有子节点的作者获取所有子孙节点获取所有价格取出第三本书的所有信息取出价格大于70块的所有书本从mongodb 中取数据的示例 介绍JSONPath能在复杂的JSON数据中 查找和提取所需的信息,它是一种功能强大的查询语言,可以通过简单的表达式来快速准确地定位和提取JSON数据。本文将介绍JSONPath的基本语法和用法,并 python javascript 开发语言 json 数据