洛谷 P3387 【模板】缩点 DAGdp学习记
我们以洛谷P3387 【模板】缩点 来学习DAGdp
1.这道题的流程
//伪代码
for i->n if(i未被遍历) tarjan(i)
缩点()
DAGdp()
完成
首先tarjan这部分应该没问题,如果想看详细的可以看我的tarjan学习记
接下来tarjan完毕,每个点属于的强连通分量也得到了,因此缩点可以进行了
这里这部分比较麻烦,下面上的代码讲的比较清楚,注释也给了。
所以现在讲讲DAGdp
我刚开始看到DAPdp……什么鬼啊?(UPD:DAG为有向无环图),然后百度,啥都没有,于是自己用类似用类似拓扑排序的方法做,发现DAGdp就是在拓扑上面弄得,那么,这就好办了
void dagdp()
{
int i,j;
queue <int> q;
for(i=;i<=cnt;i++)
{
if(!ind[i]) //找到入度为0的点,这个点一定不会被刷新,因此满足dp无后效性
{
q.push(i);
f[i]=money[i];
}
}
while(!q.empty())
{
int t=q.front();
int i,j,k;
q.pop();
for(i=head[t];i;i=e[i].next)
{
j=e[i].to;
ind[j]--; //这个点的入度减一
k=money[j];
f[j]=max(f[t]+k,f[j]);
if(!ind[j]) //如果这个点入度为0,那么这个点一定被处理完了
q.push(j); //那么又可以从这个点开始做
}
}
}
因此,这道题的程序就长这个样子
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<queue>
#include<stack> using namespace std; int size,n,m,dt,cnt;
int head[],cost[],vis[],bd[],ins[],dfn[],low[],money[];
stack <int> s;
int ind[],chd[],f[],ans=-,bl;
struct edge{
int next,to,dis;
}e[],looker[]; //looker是存的边的备份 void addedge(int next,int to,int dis)
{
e[++size].dis=dis;
e[size].to=to;
e[size].next=head[next];
head[next]=size;
} int pd(int a,int b) //判断边是否重复
{
for(int i=head[a];i;i=e[i].next)
{
int j=e[i].to;
if(j==b) return ;
}
return ;
} void tarjan(int t) //tarjan操作
{
dfn[t]=low[t]=++bl;
s.push(t);
ins[t]=;
int i,j;
for(i=head[t];i;i=e[i].next)
{
j=e[i].to;
if(!dfn[j])
{
tarjan(j);
low[t]=min(low[t],low[j]);
}
else if(ins[j]) low[t]=min(dfn[j],low[t]);
}
j=;
if(dfn[t]==low[t])
{
cnt++;
while(t!=j)
{
j=s.top();
s.pop();
ins[j]=;
bd[j]=cnt;
}
}
} void dagdp()
{
int i,j;
queue <int> q;
for(i=;i<=cnt;i++)
{
if(!ind[i]) //找到入度为0的点,这个点一定不会被刷新,因此满足dp无后效性
{
q.push(i);
f[i]=money[i];
}
}
while(!q.empty())
{
int t=q.front();
int i,j,k;
q.pop();
for(i=head[t];i;i=e[i].next)
{
j=e[i].to;
ind[j]--; //这个点的入度减一
k=money[j];
f[j]=max(f[t]+k,f[j]);
if(!ind[j]) //如果这个点入度为0,那么这个点一定被处理完了
q.push(j); //那么又可以从这个点开始做
}
}
} int main()
{
int i,j;
scanf("%d %d",&n,&m);
for(i=;i<=n;i++)
scanf("%d",&cost[i]);
for(i=;i<=m;i++)
{
int t1,t2;
scanf("%d %d",&t1,&t2);
addedge(t1,t2,);
looker[i].next=t1;
looker[i].to=t2;
}
for(i=;i<=n;i++) if(!dfn[i])tarjan(i);
memset(head,,sizeof(head));
size=;
for(i=;i<=n;i++)
{
money[bd[i]]+=cost[i];
}
for(i=;i<=m;i++)
{
if(bd[looker[i].next]==bd[looker[i].to]) continue; //我 到 我自己 ?
if(!pd(bd[looker[i].next],bd[looker[i].to]))
{
addedge(bd[looker[i].next],bd[looker[i].to],);
ind[bd[looker[i].to]]++; //统计入度与出度
chd[bd[looker[i].next]]++;
}
}
dagdp();
for(i=;i<=cnt;i++) ans=max(ans,f[i]); //比较每个点与当前最大值
printf("%d",ans);
return ;
}
洛谷 P3387 【模板】缩点 DAGdp学习记的更多相关文章
- 洛谷P3387 【模板】缩点 题解
背景 今天\(loj\)挂了,于是就有了闲情雅致来刷\(luogu\) 题面 洛谷P3387 [模板]缩点传送门 题意 给定一个\(n\)个点\(m\)条边有向图,每个点有一个权值,求一条路径,使路径 ...
- tarjan缩点练习 洛谷P3387 【模板】缩点+poj 2186 Popular Cows
缩点练习 洛谷 P3387 [模板]缩点 缩点 解题思路: 都说是模板了...先缩点把有环图转换成DAG 然后拓扑排序即可 #include <bits/stdc++.h> using n ...
- 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)
To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...
- 洛谷——P3387 【模板】缩点
P3387 [模板]缩点 题目背景 缩点+DP 题目描述 给定一个n个点m条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权值和. 允许多次经过一条边或者一个点, ...
- 洛谷P3387 【模板】缩点
题目背景 缩点+DP 题目描述 给定一个n个点m条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权值和. 允许多次经过一条边或者一个点,但是,重复经过的点,权值只 ...
- 洛谷 P3387 【模板】缩点
题目背景 缩点+DP 题目描述 给定一个n个点m条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权值和. 允许多次经过一条边或者一个点,但是,重复经过的点,权值只 ...
- 洛谷P3375 [模板]KMP字符串匹配
To 洛谷.3375 KMP字符串匹配 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.如果 ...
- LCT总结——概念篇+洛谷P3690[模板]Link Cut Tree(动态树)(LCT,Splay)
为了优化体验(其实是强迫症),蒟蒻把总结拆成了两篇,方便不同学习阶段的Dalao们切换. LCT总结--应用篇戳这里 概念.性质简述 首先介绍一下链剖分的概念(感谢laofu的讲课) 链剖分,是指一类 ...
- 洛谷 P2656 (缩点 + DAG图上DP)
### 洛谷 P2656 题目链接 ### 题目大意: 小胖和ZYR要去ESQMS森林采蘑菇. ESQMS森林间有N个小树丛,M条小径,每条小径都是单向的,连接两个小树丛,上面都有一定数量的蘑菇.小胖 ...
随机推荐
- decltype使用
#include<thread> #include<array> #include<iostream> #include<windows.h> #inc ...
- LightOJ 1235 - Coin Change (IV) (折半枚举)
题目链接: http://www.lightoj.com/volume_showproblem.php?problem=1235 题目描述: 给出n个硬币,每种硬币最多使用两次,问能否组成K面值? 解 ...
- python_函数进阶(5)
第1章 函数有用信息1.1 login.__doc__1.2 login.__name__第2章 装饰器的进阶2.1 带参数的装饰器2.2 多个装饰器装饰一个函数2.3 开放封闭原则 第3章 可迭代对 ...
- Solr打分排序规则自定义【转】
在搭建好solrCloud搜索集群后,通过编写基本的查询显示语句已经能够通过输入关键字查询到相应结果进行显示,但是在显示结果排序上以及不相关信息过滤问题上,如何制定合理的打分规则得到理想的结果集确实比 ...
- 机器学习概念之特征处理(Feature processing)
不多说,直接上干货! 肯定也有不少博友,跟我一样,刚开始接触的时候,会对这三个概念混淆. 以下是,特征处理.特征提取.特征转换和特征选择的区别! 特征处理主要包含三个方面:特征提取.特征转换和特征选择 ...
- java课程设计全程实录——第0天
本次课设计划在5月25日完成.目前还剩18天. 第0天主要完成事项如下: 搭建开发环境 制定开发进度规划表 阅读前人的课设 详细: 1.IDE的下载,安装,以及配合使用的阿里巴巴编程规约插件的安装与测 ...
- fetch和axios区别,proxy代理配置
1.今天使用fetch调用接口时使用console.log(res.data)始终是undefined,使用anxios请求则可以成功请求到数据,非常奇怪,于是查了一圈,才搞明白是我自以为了,哎,浪费 ...
- jQuery Validate自定义各种验证方法(转)
一.封装自定义验证方法-validate-methods.js /***************************************************************** j ...
- ArcGIS Desktop新建postgresql版sde(10.4.1)的连接
假设连接到的sde数据库是pg数据库,其他参数包括: ip:10.0.0.8 数据库:sde1 用户:sde 密码:sde 打开catalog,新建数据库连接 按如下输入数据库连接参数 红框1是数据库 ...
- tree 树状构建
/*package ch.util; import com.trm.model.func.FunctionTree; import java.util.HashMap; import java.uti ...