题解 P3387 【【模板】缩点】
给定一个 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 【【模板】缩点】相关推荐
- 强连通分量:洛谷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 ...
- 图论,专为迷途少年而生
文章目录 目录 图的存储 邻接矩阵 前向星 Topsort P1038 神经网络 P1983 车站分级 最小生成树 MST 堆优化Prim 并查集Kruskal Matrix Tree Theory ...
- [洛谷P3387]【模板】缩点
题目大意:给定一个$n$个点$m$条边有向图,第$i$个点有权值$w_i$,求一条路径,使路径经过的点权值之和最大,输出点权和,(多次经过一个点只算一次点权) 题解:$tarjan$缩点+$DP$ 卡 ...
- 『ACM』ACM模板合集
写在前面: 第一年小白拿铜牌,第二年队友出走,加上疫情原因不能回校训练导致心底防线彻底崩盘,于是选择退役. 自从退役之后,一直想我打了那么久的ACM,什么也没留下觉得很难受,突然想到我打ACM的时候, ...
- Poj 2186 Popular Cows(Tarjan 强连通缩点)
传送门:Poj 2186 题意:给你n头牛,m种关系,A牛认为B牛是popular的,B牛认为C牛是popular的,则A也认为C是popular的,问最终有几头被所有牛认为是popular的牛 题解 ...
- P4720 【模板】扩展卢卡斯定理/exLucas(无讲解,纯记录模板)
P4720 [模板]扩展卢卡斯定理/exLucas 题意: CnmmodpC_{n}^{m}\bmod pCnmmodp 对于 100% 的数据,1≤m≤n≤1018,2≤p≤106,不保证 p 是 ...
- 【模板】差分约束算法
[模板]差分约束算法 题意: 题解: 模板题 算法讲解 给出一组包含 m 个不等式,有 n 个未知数.求任意一组满足这个不等式组的解,或判定无解. 连边之后跑最短路,保证每个连通块都没有负环即可. 也 ...
最新文章
- android 自定义 styleable 属性
- 取消管理员取得所有权_企业取得违约补偿款是否一律应缴增值税呢?
- zerodivisionerror什么意思python-Python with as的用法
- 云计算:革新动力并不是一把万能钥匙
- 动态规划:记忆化搜索
- 【数据竞赛】“达观杯”文本智能处理挑战赛4
- Android项目实战(十三):浅谈EventBus
- Delphi 的各种错 误 信 息(中英文)
- pythondatetime小时_使用python从时间戳中提取小时
- linux/shell相关知识点
- 深度学习之卷积神经网络(Convolutional Neural Networks, CNN)
- 会声会影x4素材_如何利用会声会影制作抖音短视频
- 并查集及其简单应用:优化kruskal算法
- Mac升级emacs26
- Presto为什么快
- java长连接转短连接_HTTP的长连接和短连接转换接口(API)
- 油管大神教波士顿机器狗学撒尿-给自己倒啤酒,网友:太恶趣味了
- AutoIt 在线中文文档、开发工具 (GUI 图形开发工具)
- 考研英语阅读理解做题技巧(4):态度题
- 基于jQuery的软键盘【模拟软键盘】