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

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

前置知识

强联通分量

拓扑排序

没学过的同学可以学一下。

分析

我们可以先用强联通分量对图进行缩点,那么现在,这张图就是 DAGDAGDAG 了。我们再拓扑排序,然后就去 dpdpdp。

dpdpdp 是这样的:

我们用 fif_ifi​ 表示以第 iii 个点结尾的最优路径,这个显然很好转移。

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
template<typename T>inline void read(T &FF){T RR=1;FF=0;char CH=getchar();for(;!isdigit(CH);CH=getchar())if(CH=='-')RR=-1;for(;isdigit(CH);CH=getchar())FF=(FF<<1)+(FF<<3)+(CH^48);FF*=RR;
}
const int MAXN=1e6+10,MAXM=1e6+10;
int s[MAXN],stop,dfn[MAXN],low[MAXN],scccnt,sccnum[MAXN],dfscnt,tot,he[MAXN],ne[MAXM<<1],ed[MAXM<<1],n,x,y,ds[MAXN],de[MAXN],m,dis[MAXN],tp,ans[MAXN],sum,f[MAXN];
queue<int>q;
vector<int>rd[MAXN];
vector<int>cd[MAXN];
void add(int x,int y){ed[++tot]=y;ne[tot]=he[x];he[x]=tot;
}
void tuopu(){for(int i=1;i<=scccnt;i++)if(!de[i])q.push(i);while(q.size()){int u=q.front();q.pop();ans[++tp]=u;for(auto i:cd[u])if(--de[i]==0)q.push(i);}
}
inline void tarjan(int now){dfn[now]=low[now]=++dfscnt;s[stop++]=now;for(int i=he[now];i;i=ne[i]){if(!dfn[ed[i]]){tarjan(ed[i]);low[now]=min(low[now],low[ed[i]]);}else if(!sccnum[ed[i]]){low[now]=min(low[now],dfn[ed[i]]);}}if(dfn[now]==low[now]){scccnt++;do{sccnum[s[--stop]]=scccnt;ds[scccnt]+=dis[s[stop]];}while(s[stop]!=now);}
}
int main(){read(n);read(m);for(int i=1;i<=n;i++)read(dis[i]);for(int i=1;i<=m;i++){read(x);read(y);add(x,y);}for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i);for(int i=1;i<=n;i++)for(int j=he[i];j;j=ne[j])if(sccnum[i]!=sccnum[ed[j]]){de[sccnum[ed[j]]]++;cd[sccnum[i]].push_back(sccnum[ed[j]]);rd[sccnum[ed[j]]].push_back(sccnum[i]);}tuopu();for(int i=1;i<=tp;i++){f[ans[i]]=ds[ans[i]];for(auto j:rd[ans[i]])f[ans[i]]=max(f[ans[i]],f[j]+ds[ans[i]]);}for(int i=1;i<=scccnt;i++)sum=max(f[i],sum);cout<<sum;return 0;
}

题解 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. 图论,专为迷途少年而生

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

  5. [洛谷P3387]【模板】缩点

    题目大意:给定一个$n$个点$m$条边有向图,第$i$个点有权值$w_i$,求一条路径,使路径经过的点权值之和最大,输出点权和,(多次经过一个点只算一次点权) 题解:$tarjan$缩点+$DP$ 卡 ...

  6. 『ACM』ACM模板合集

    写在前面: 第一年小白拿铜牌,第二年队友出走,加上疫情原因不能回校训练导致心底防线彻底崩盘,于是选择退役. 自从退役之后,一直想我打了那么久的ACM,什么也没留下觉得很难受,突然想到我打ACM的时候, ...

  7. Poj 2186 Popular Cows(Tarjan 强连通缩点)

    传送门:Poj 2186 题意:给你n头牛,m种关系,A牛认为B牛是popular的,B牛认为C牛是popular的,则A也认为C是popular的,问最终有几头被所有牛认为是popular的牛 题解 ...

  8. P4720 【模板】扩展卢卡斯定理/exLucas(无讲解,纯记录模板)

    P4720 [模板]扩展卢卡斯定理/exLucas 题意: CnmmodpC_{n}^{m}\bmod pCnm​modp 对于 100% 的数据,1≤m≤n≤1018,2≤p≤106,不保证 p 是 ...

  9. 【模板】差分约束算法

    [模板]差分约束算法 题意: 题解: 模板题 算法讲解 给出一组包含 m 个不等式,有 n 个未知数.求任意一组满足这个不等式组的解,或判定无解. 连边之后跑最短路,保证每个连通块都没有负环即可. 也 ...

最新文章

  1. android 自定义 styleable 属性
  2. 取消管理员取得所有权_企业取得违约补偿款是否一律应缴增值税呢?
  3. zerodivisionerror什么意思python-Python with as的用法
  4. 云计算:革新动力并不是一把万能钥匙
  5. 动态规划:记忆化搜索
  6. 【数据竞赛】“达观杯”文本智能处理挑战赛4
  7. Android项目实战(十三):浅谈EventBus
  8. Delphi 的各种错 误 信 息(中英文)
  9. pythondatetime小时_使用python从时间戳中提取小时
  10. linux/shell相关知识点
  11. 深度学习之卷积神经网络(Convolutional Neural Networks, CNN)
  12. 会声会影x4素材_如何利用会声会影制作抖音短视频
  13. 并查集及其简单应用:优化kruskal算法
  14. Mac升级emacs26
  15. Presto为什么快
  16. java长连接转短连接_HTTP的长连接和短连接转换接口(API)
  17. 油管大神教波士顿机器狗学撒尿-给自己倒啤酒,网友:太恶趣味了
  18. AutoIt 在线中文文档、开发工具 (GUI 图形开发工具)
  19. 考研英语阅读理解做题技巧(4):态度题
  20. 基于jQuery的软键盘【模拟软键盘】

热门文章

  1. HC-SR501 人体红外感应模块 单片机
  2. React 设置网页title
  3. 原生threeJS入门
  4. 图像修复序列——BSCB模型
  5. 张一鸣打造“抖音”等现象级产品的秘密:技术深度融合业务,引爆产品创新!...
  6. 业务异步写mysql数据库_把重要的业务日志异步批量写入数据库
  7. 基于51单片机的烟雾火灾报警系统
  8. 【软件测试】如何定位web前后台的BUG
  9. 一个简单的点赞功能的实现
  10. PayPal取消了连连支付快捷提现,我是如何提现到国内的?