P1113 杂务 (DAG拓扑排序--DP)
这是一道拓扑排序的模板题
0 额.
所需的前置知识:
- 图论相关的基本概念
- 建图,存图
- 图的遍历
- 非常入门的DP
下面进入正文
1 引入
拓扑排序是一类用于处理 DAG(Directed acyclic graph),即有向无环图上的问题。
以这道题为例,我们分析拓扑排序的作用:
显然地,本题中各项工作是有一定的依赖条件的,也就是说我们在进行工作 X 之前可能需要先进行一些其他的工作。
而完成工作 X 所需的时间和所有 X 所依赖的工作完成的时间的最大值有关。(应该还好理解吧)
在这道题中,我们可以列出一个简单的 DP 转移方程:
\]
其中\(f_i\)为从最开始到进行完第\(i\)项任务所需的时间,\(pre_i\)为\(i\)号结点的前驱数组,\(a_i\)为做第\(i\)件事所需的时间。
但是,我们如果直接进行dfs遍历,可能会出新一个问题:\(在我们计算f_i的时候,还存在没有计算过的pre_i,从而导致计算结果错误\)
那么,我们在计算的时候,应该确保在计算一个结点\(u\)时,所有与连向它的点都已经被计算过。
而实现这一过程就利用到了今天的主角:拓扑排序(topo sort)
锣鼓题解:记忆化搜索。?
此方法可以达到拓扑排序得目的
#include<bits/stdc++.h>
#define MAXN 10010
using namespace std;
int n,x,y,t,ans,len[MAXN],vis[MAXN];
vector<int>e[MAXN];
int miHoYo(int x){
if(vis[x]) return vis[x];//如果被访问过,直接返回
for(int i=0;i<e[x].size();i++)// 循环:x每条边指向的点
vis[x]=max(vis[x],miHoYo(e[x][i]));// 动态规划,求最大值
vis[x]+=len[x];//加上所需要的时间,构成动态规划公式
return vis[x];
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>x>>len[i];
while(cin>>y)
if(!y) break;
else e[y].push_back(x);
}
for(int i=1;i<=n;i++)//对于每个点进行dfs求f得最大值
ans=max(ans,miHoYo(i));// 取最大值
cout<<ans;
return 0;
}
拓扑排序代码拷自Keith_2006
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cctype>
#include <vector>
#include <queue>
#define ll long long
using namespace std;
inline int read() {
int x=0,f=1;
char ch=getchar();
while (!isdigit(ch)) {if (ch=='-') f=-1;ch=getchar();}
while (isdigit(ch)) x=x*10+ch-'0',ch=getchar();
return x*f;
}
const int N=500005;
int ind[N],f[N],a[N]; //ind--入度 f--答案 a--时间
vector <int> edge[N];
queue <int> q;
int main() {
int n=read();
for (int i=1;i<=n;i++) {
int x=read();
a[i]=read();
while (int y=read()) {
if (!y) break;
edge[y].push_back(x);
ind[x]++;
}
}
//步骤一
for (int i=1;i<=n;i++) {
if (ind[i]==0) {
q.push(i);
f[i]=a[i];
}
};
while (!q.empty()) {
int rhs=q.front();
q.pop();
//步骤二
for (int i=0;i<edge[rhs].size();i++) {
int u=edge[rhs][i];
ind[u]--;
if (ind[u]==0) q.push(u); //步骤三
f[u]=max(f[u],f[rhs]+a[u]);
}
}
int ans=0;
for (int i=1;i<=n;i++) {
ans=max(ans,f[i]); //统计答案
}
printf("%d\n",ans);
return 0;
}
拓扑排序详细讲述见P4017 最大食物链计数
P1113 杂务 (DAG拓扑排序--DP)的更多相关文章
- Luogu P1113 杂务 【拓扑排序】 By cellur925
题目传送门 这题我们一看就知道是拓扑排序,然而在如何转化问题上花了大工夫,一个小时后最后还是无奈看了题解qwq. 显然我们可以对于每个任务,从他的前导任务到他连一条边,最后我们可以得到一个DAG.在这 ...
- 洛谷P3244 落忆枫音 [HNOI2015] 拓扑排序+dp
正解:拓扑排序+dp 解题报告: 传送门 我好暴躁昂,,,怎么感觉HNOI每年总有那么几道题题面巨长啊,,,语文不好真是太心痛辣QAQ 所以还是要简述一下题意,,,就是说,本来是有一个DAG,然后后来 ...
- 【bzoj4011】[HNOI2015]落忆枫音 容斥原理+拓扑排序+dp
题目描述 给你一张 $n$ 个点 $m$ 条边的DAG,$1$ 号节点没有入边.再向这个DAG中加入边 $x\to y$ ,求形成的新图中以 $1$ 为根的外向树形图数目模 $10^9+7$ . 输入 ...
- 【bzoj1093】[ZJOI2007]最大半连通子图 Tarjan+拓扑排序+dp
题目描述 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:对于u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v的有向路径或者从v到u的有向路径. ...
- 【bzoj4562】[Haoi2016]食物链 拓扑排序+dp
原文地址:http://www.cnblogs.com/GXZlegend/p/6832118.html 题目描述 如图所示为某生态系统的食物网示意图,据图回答第1小题 现在给你n个物种和m条能量流动 ...
- POJ 3249 拓扑排序+DP
貌似是道水题.TLE了几次.把所有的输入输出改成scanf 和 printf ,有吧队列改成了数组模拟.然后就AC 了.2333333.... Description: MR.DOG 在找工作的过程中 ...
- [NOIP2017]逛公园 最短路+拓扑排序+dp
题目描述 给出一张 $n$ 个点 $m$ 条边的有向图,边权为非负整数.求满足路径长度小于等于 $1$ 到 $n$ 最短路 $+k$ 的 $1$ 到 $n$ 的路径条数模 $p$ ,如果有无数条则输出 ...
- 【BZOJ-1194】潘多拉的盒子 拓扑排序 + DP
1194: [HNOI2006]潘多拉的盒子 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 456 Solved: 215[Submit][Stat ...
- 【BZOJ5109】[CodePlus 2017]大吉大利,晚上吃鸡! 最短路+拓扑排序+DP
[BZOJ5109][CodePlus 2017]大吉大利,晚上吃鸡! Description 最近<绝地求生:大逃杀>风靡全球,皮皮和毛毛也迷上了这款游戏,他们经常组队玩这款游戏.在游戏 ...
- bzoj1093[ZJOI2007]最大半连通子图(tarjan+拓扑排序+dp)
Description 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v的有向路径或者从v到u ...
随机推荐
- 沁恒 CH32V208(四): CH32V208 网络DHCP示例代码分析
目录 沁恒 CH32V208(一): CH32V208WBU6 评估板上手报告和Win10环境配置 沁恒 CH32V208(二): CH32V208的储存结构, 启动模式和时钟 沁恒 CH32V208 ...
- npm install报错node-sass@7.0.1 postinstall: `node scripts/build.js`
在控制台执行 即可 npm config set sass_binary_site=https://npm.taobao.org/mirrors/node-sass
- webGPU orillusion(一)
关于架构的理解与认识 Orillusion 核心借鉴了 ECS 结构,遵循 组合优于继承 的开发设计原则,实现了自己的组件系统.我们将传统复杂的逻辑划分为独立的.可重复利用的部分,每个部分可以单独 ...
- Mdnice 简洁主题
Md2All 是个人非常喜欢的一个 Markdown 排版工具,也是一直以来本公众号推文排版编辑的主要阵地.但发现 Md2All 有时候会非常卡(不太清楚是不是 Md2All 用了国外的服务器),而且 ...
- 在技术圈混,不知道这些你就 OUT 了
技术之路就是漫长的打怪升级,不断学习前人的踩坑经验才能提升自己,切忌闭门造车.所谓独乐乐不如众乐乐,强烈推荐以下公众号,让你的生活多点意思,希望小伙伴们能在 coding 的路上走的更远. OSC开源 ...
- mimikatz
mimikatz 来源:https://github.com/gentilkiwi/mimikatz Mimikatz 是由法国人 Benjamin Delpy 编写的 Windows 密码提取工具, ...
- tryhackem_wonderland
涉及,解密,扫描,横向移动,纵向移动 仙境 掉进兔子洞,进入仙境. 获得shell 解法一: 目录扫描 ffuf -u http://10.10.134.189/FUZZ -w /usr/share/ ...
- 基于渗透的python
Python for Pentesters 还记得开始学习编程的C,虽然淡忘,但思想仍在. 子域名枚举 request库 import pyfiglet import requests import ...
- Vue——登录小案例、scoped、ref属性、props其他、混入mixin、插件、Element-ui
解析Vue项目 # 1 为什么浏览器中访问某个地址,会显示某个页面组件 根组件:APP.vue 必须是 <template> <div id="app"> ...
- .NET指定图片地址下载并转换Base64字符串
需求描述 需要调用第三方图片上传接口上传图片,对方图片格式只能接收Base64字符串.所以我们需要将系统服务器的图片通过Url下载下来,然后转换成Base64字符串.接下来我们将使用HttpClien ...