洛谷 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条小径,每条小径都是单向的,连接两个小树丛,上面都有一定数量的蘑菇.小胖 ...
随机推荐
- 用JS改变页面中b标签的样式啊 样式的等
用JS改变页面中b标签的样式啊 样式的等 ,实际上是在标签内加上样式 ,用媒体查询的话 ,不能生效 <!DOCTYPE html> <html lang="en&qu ...
- Codeforces Round #418 (Div. 2) A
Description A few years ago, Hitagi encountered a giant crab, who stole the whole of her body weight ...
- GCD Counting Codeforces - 990G
https://www.luogu.org/problemnew/show/CF990G 耶,又一道好题被我浪费掉了,不会做.. 显然可以反演,在这之前只需对于每个i,统计出有多少(x,y),满足x到 ...
- jmeter(二十)JMeter中返回Json数据的处理方法
Json 作为一种数据交换格式在网络开发,特别是 Ajax 与 Restful 架构中应用的越来越广泛.而 Apache 的 JMeter 也是较受欢迎的压力测试工具之一,但是它本身没有提供对于 Js ...
- Oozie的作用
Oozie的作用: 1.统一调度hadoop系统中常见的mr任务启动. hdfs操作. shell调度. hive操作等 2.使得复杂的依赖关系.时间触发.事件触发使用xml语言进行表达,开发效率提高 ...
- 为localhost添加https
1.按照https://stackoverflow.com/a/7184031/4619958来做 其中,CommonName填写localhost 2.在ssl.conf里头加上 <Direc ...
- Ionic之ui-sref引入图片,图片部分挡住解决方案
ionic图片设置大小跟图片像素相同,但是使用ui-sref="parkInfo"上半部分图片会挡住,增加height的高度,就可以显示原本图片 页面: <ion-conte ...
- P2006 赵神牛的游戏
题目描述 在DNF 中,赵神牛有一个缔造者,他一共有k点法力值,一共有m个技能,每个技能耗费的法力值为a[i],可以造成的伤害为b[i],而boss 的体力值为n,请你求出它放哪个技能,才可以打死bo ...
- 在Oracle用SQL处理以 System.currentTimeMillis
有時為了系統的需求會紀錄到毫秒(Millisecond),我們會接將得到的值寫入db,但是如果要用SQL 做時間範圍的搜尋,有以下做法( systemdate欄位存放System.currentTim ...
- python基础一 day4 字典
增加: 结果 删: 结果: 结果: 返回值是一个元组形式的键值 改: 结果: 结果: 代码: info=inpu ...