给定一个n个点m条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大。你只需要求出这个权值和。允许多次经过一条边或者一个点,但是,重复经过的点,权值只计算一次。

缩点含义:将一个环缩成一个点,然后把原本环上的点与外界相连的边,接到这个点上面
换句话讲就是 tarjan求出的所有强连通分量都变成点,这样有向有环图就变成有向无环图(DAG),化简了问题
对于这题,因为可以重复走边且只计算一次,那么如果有环的话为何不走,既然走了,那么这个环本身对答案其实就无意义了,所以用缩点

缩点做法:
工具:tarjan的dfn,low,stack,dfs
思想:stack栈回溯的时候,环中点的权值都加到最先遍历的点上

int tim=;
int color_num=;
void tarjan(int u){
dfn[u]=low[u]=++tim;
s[++top]=u;
vis[u]=;
for(i,fi[u],nx){
int v=e[i].to;
if(!dfn[v])tarjan(v),chkmin(low[u],low[v]);
else if(vis[v])chkmin(low[u],dfn[v]);
}
//回溯
if(low[u]==dfn[u]){
color_num++;
while(s[top+]!=u){//就是这里top+1
color[s[top]]=color_num;
sum[color_num]+=val[s[top]];//就这一步回加
vis[s[top--]=false;//这里放top--
}}}
//回溯这么写也很优秀,反正u最后处理
if(low[u]==dfn[u]){
int v;
while(v=s[top--]){
point[v]=u;//指向u
vis[v]=false;
if(u==v)break;
sum[u]+=sum[v];
}} For(i,,n)
if(!dfn[i])tarjan(i,i);

下面处理DAG中计算最大权值问题
两种思路:
1.记忆化dfs
2.拓扑排序(针对存在后效性dp的手段)

记得重新建DAG图

法一:

void dfs(int u){
if(f[u])return;
int res=;
for(i,fi[u],nx){
int v=e[i].to;
dfs(v);
chkmax(res,f[v]);
}
f[u]+=res;
} For(i,,m)
if(color[e[i].to]!=color[e[i].from])
add(color[e[i].to],color[e[i].from]); For(i,,color_num)
if(!f[i])dfs(i),chkmax(ans,f[i]);

法二:

void topo(){
queue<int>q;
For(i,,n)
if(in[i]==&&point[i]==i)q.push(i),f[i]=sum[i];
while(!q.empty()){
int u=q.front();q.pop();
for(i,fi[u],nx){
int v=e[i].to;
in[v]--;
chkmax(f[v],f[u]+sum[v]);
if(!in[v])q.push(v);
}}
For(i,,n)
chkmax(ans,f[i]);
}

缩点tarjan的更多相关文章

  1. 【并查集缩点+tarjan无向图求桥】Where are you @牛客练习赛32 D

    目录 [并查集缩点+tarjan无向图求桥]Where are you @牛客练习赛32 D PROBLEM SOLUTION CODE [并查集缩点+tarjan无向图求桥]Where are yo ...

  2. 缩点Tarjan算法解析+[题解]受欢迎的牛

    (注:我在网上找了一些图,希望原博主不要在意,谢谢,(。☉౪ ⊙。)) 首先来了解什么是强连通分量 有向图强连通分量:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向 ...

  3. [模板][Luogu3387] 缩点 - Tarjan, 拓扑+DP

    Description 给定一个n个点m条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权值和. 允许多次经过一条边或者一个点,但是,重复经过的点,权值只计算一次 ...

  4. 【模板】缩点(tarjan,DAG上DP)

    题目背景 缩点+DP 题目描述 给定一个n个点m条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权值和. 允许多次经过一条边或者一个点,但是,重复经过的点,权值只 ...

  5. 【模板】缩点 tarjan+dp

    题目背景 缩点+DP 题目描述 给定一个n个点m条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权值和. 允许多次经过一条边或者一个点,但是,重复经过的点,权值只 ...

  6. P3387 【模板】缩点 tarjan

    虽说是模板题,但是竟然中间有dp的部分...先tarjan缩点,重新建图.然后记忆化搜索,搜索dag中的最小环. 题干: 题目背景 缩点+DP 题目描述 给定一个n个点m条边有向图,每个点有一个权值, ...

  7. P3387缩点(tarjan+拓扑排序+线性dp)

    题目描述 给定一个 n个点 m 条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权值和. 允许多次经过一条边或者一个点,但是,重复经过的点,权值只计算一次. 输入 ...

  8. 图论--SCC缩点--Tarjan

    // Tarjan算法求有向图强连通分量并缩点 /*强连通缩点与双连通缩点大同小异,也就是说将强连通分支缩成一个点之后,没有强连通,成为有向无环图,在对图进行题目的操作.*/ #include< ...

  9. 图论--SCC强连通缩点--Tarjan

    强连通缩点与双连通缩点大同小异,也就是说将强连通分支缩成一个点之后,没有强连通,成为有向无环图,在对图进行题目的操作. // Tarjan算法求有向图强连通分量并缩点 #include<iost ...

随机推荐

  1. Java 基础:变量 与 字符串

    变量 Java中没有初始化的变量是不能直接使用的 局部变量 String msg; System.out.print(msg); 就会提示错误,我们必须显式的为变量指定一个初值如null.刚开始学Ja ...

  2. Angular环境搭建

    Angular4 随笔(一)----环境搭建 1.下载node.js 第一步:在浏览器中搜索node.js官网(https://nodejs.org/zh-cn/),根据自己系统下载相应版本,下载完成 ...

  3. 巧用css的border属性完成对图片编辑功能的性能优化

    一.需求场景: 最近闲来无事,boss提出了一个要求,研究相关代码并完成一个关于编辑图片功能的性能优化,该功能的主要界面展示如下: 通过了几分钟的短暂试用,发现就是一个简单的裁剪并保存用户选择并上传的 ...

  4. JS中冒泡排序,选择排序,快速排序

        var arr = [1,4,2,9,7,6,5,4,7,5];     // 冒泡排序(通俗的说就是j 和 j+1打,谁赢了谁去后面)       for(var i = 1;i<ar ...

  5. es6 export与export default 的区别

    相同点: 均可用于导出常量.函数.文件.模块等 不同点: 1.在一个文件中export可以有多个,但export default 只能有一个: export var firstName = 'Mich ...

  6. 安装cuda8.0时无法安装.net Framework 4.0 错误的解决

    作者:朱金灿 来源:http://blog.csdn.net/clever101 在win7 64位旗舰版(带sp1)上安装cuda时到安装Microsoft.NET Framework4.0,一直停 ...

  7. wampserver的配置教程

    对于初做PHP网站的朋友来说,第一步肯定是希望在自己电脑是搭建PHP环境,省去空间和上传的麻烦!但搭建环境也不是件容易的事情,特别是对于新手同学来说!因此在这里跟大家介绍我作为一名新手在使用的方便好用 ...

  8. Ionic模版的使用

    Hybird HTML5 App(移动应用开发)之4.Ionic模版的使用 在Windows系统下使Ionic模版,可以使用之前安装的Git工具中的Git Bash.在Mac系统中可以直接使用系统自带 ...

  9. SQL Server如何附加只有mdf的数据库文件

    有时候SQL Server意外断电会导致SQL Server的ldf日志文件丢失或者损坏,这个时候你如果直接附加mdf文件到SQL Server会失败,这里提供一个方法可以还原只有mdf的数据库文件, ...

  10. mysql主从不同步问题 Error_code: 1236

    第一种情况,开启GTID,从库与主库不同步. 1.在从库上查看从的状态   mysql> show slave status \G *************************** 1. ...