给定一个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. python基础技巧综合训练题2

    1,判断一个字符串中的每一个字母是否都在另一个字符串中,可以利用集合的特性来解,集合的元素如果存在,再次更新(update) 是添加不进集合的,那么集合的长度还是跟原来一样,如果添加进去,集合长度就会 ...

  2. 常见Java问题

    1.泛型的好处 保护了类型安全 避免了强制类型转化 2.final关键字的作用 final修饰的属性是常量 final修饰的方法不可被重写 final修饰的类不能被继承,如:String 3.静态变量 ...

  3. JDK8下maven使用maven-javadoc-plugin插件报错

    由于JDK8的doc生成机制比之前的要严谨许多,导致项目用maven打包的时候出错 解决办法: 添加-Xdoclint:none配置 完整配置如下:   <plugin> <grou ...

  4. 【CLR Via C#】2 程序集

    1 定义: 程序集是net 应用程序的部署单元,是组件服用,以及实施安全策略和版本策略的最小单元. 程序集是包含一个或者多个类型定义文件和资源的集合 本地dll或exe与程序集不同           ...

  5. php 实现简单加入购物车(1)

          这个购物车相对来说比较简单,用于短暂存储,并没有存储到数据库,购物车对于爱网购的人来说简直是熟悉的不能再熟悉了,在写购物车之前,我们首先要构思一下,我们需要先从数据库中调出一张表格,这里我 ...

  6. Sql server 索引详解

    参考资料:老K写的,http://www.cnblogs.com/AK2012/archive/2013/01/04/2844283.html SQL索引在数据库优化中占有一个非常大的比例, 一个好的 ...

  7. MS SQL backup database的俩个参数

    http://msdn.microsoft.com/zh-cn/library/ms186865.aspx 数据传输选项 BUFFERCOUNT = { buffercount | @bufferco ...

  8. tomcat上传内容报错

    公司项目报错: o.s.boot.web.support.ErrorPageFilter          :  Forwarding  to  error  page  from  request  ...

  9. Oracle EBS INV创建保留

    CREATE or REPPLACE PROCEDURE CreateReservation AS -- Common Declarations l_api_version NUMBER := 1.0 ...

  10. SQL Server全文搜索(转载)

    看这篇文章之前请先看一下下面我摘抄的全文搜索的MSDN资料,基本上MSDN上关于全文搜索的资料的我都copy下来了并且非常认真地阅读和试验了一次,并且补充了一些SQL语句,这篇文章本人抽取了一些本人自 ...