拓扑排序Topological sorting/DFS C++应用例题P1113 杂务

news/2024/9/19 15:29:21

拓扑排序

拓扑排序可以对DFS的基础上做变更从而达到想要的排序效果。因此,我们需要xy准备,vis数组记录访问状态,每一个任务都可以在dfs的过程中完成。

在使用拓扑排序方法时一些规定:

  • 通常使用一个零时栈
  • 不会直接输出排序的节点
  • 而是递归相邻的所有节点然后入栈
  • 最后输出排序后的所有节点顺序

P1113 杂务

题面

题目描述

John 的农场在给奶牛挤奶前有很多杂务要完成,每一项杂务都需要一定的时间来完成它。比如:他们要将奶牛集合起来,将他们赶进牛棚,为奶牛清洗乳房以及一些其它工作。尽早将所有杂务完成是必要的,因为这样才有更多时间挤出更多的牛奶。

当然,有些杂务必须在另一些杂务完成的情况下才能进行。比如:只有将奶牛赶进牛棚才能开始为它清洗乳房,还有在未给奶牛清洗乳房之前不能挤奶。我们把这些工作称为完成本项工作的准备工作。至少有一项杂务不要求有准备工作,这个可以最早着手完成的工作,标记为杂务 1。

John 有需要完成的 n 个杂务的清单,并且这份清单是有一定顺序的,杂务 k (k>1) 的准备工作只可能在杂务 1 至 k−1 中。

写一个程序依次读入每个杂务的工作说明。计算出所有杂务都被完成的最短时间。当然互相没有关系的杂务可以同时工作,并且,你可以假定 John 的农场有足够多的工人来同时完成任意多项任务。

输入格式

第1行:一个整数 n (3≤n≤10,000),必须完成的杂务的数目;

第 2 至 n+1 行,每行有一些用空格隔开的整数,分别表示:

  • 工作序号(保证在输入文件中是从 1 到 n 有序递增的);
  • 完成工作所需要的时间 len (1≤len≤100);
  • 一些必须完成的准备工作,总数不超过 100 个,由一个数字 0 结束。有些杂务没有需要准备的工作只描述一个单独的 0。

保证整个输入文件中不会出现多余的空格。

输出格式

一个整数,表示完成所有杂务所需的最短时间。

输入输出样例

输入 #1

7
1 5 0
2 2 1 0
3 3 2 0
4 6 1 0
5 1 2 4 0
6 8 2 4 0
7 4 3 5 6 0

输出 #1

23

题解

如果要知道vis[i],就要求解引向它的结点。所以将其反向建边,进行记忆化搜索。枚举每个结点进行dfs。

记忆化搜索步骤如下:

•如果vis 有值则直接返回

•遍历其来源结点

•取最大值加上自己时间

•缓存并返回

代码

#include<bits/stdc++.h>
using namespace std;
#define MAXN 10010
int n, ans, len[MAXN], vis[MAXN];
// len 是任务时长,vis 从 1 结点到这个结点的最短时间
vector <int> p[MAXN];

int dfs(int x) {
    if (vis[x]) return vis[x]; // 如果之前计算过结果就直接返回
    for (int i=0;i<p[x].size();i++) // 枚举 x 连出的每个边
        vis[x] = max(vis[x], dfs(p[x][i])); // 比较这个对应结点的值会不会更大。递归计算
    vis[x] += len[x]; // 要加上 x 结点自己的任务时间
    return vis[x];
}


int main() {
    cin >> n;
    for (int i = 1; i <= n; i++) { //复杂度O(n)
        int x, y;
        cin >> x >> len[x];
        while (cin >> y)
            if (!y)
                break;
            else
                p[y].push_back(x); // 连 y->x 边
    }
    for (int i = 1; i <= n; i++)
        ans = max(ans, dfs(i)); // 计算结点 i 开始的结果,看看会不会更优
    cout << ans;
    return 0;
}




http://lihuaxi.xjx100.cn/news/1476655.html

相关文章

opencv-全景图像拼接

运行环境 python3.6 opencv 3.4.1.15 stitcher.py import numpy as np import cv2class Stitcher:#拼接函数def stitch(self, images, ratio0.75, reprojThresh4.0,showMatchesFalse):#获取输入图片(imageB, imageA) images#检测A、B图片的SIFT关键特征点&#xff0c;并计算…

前端工程化概述

软件工程定义&#xff1a;将工程方法系统化地应用到软件开发中 前端发展历史 前端工程化的发展历史可以追溯到互联网的早期阶段&#xff0c;随着前端技术的不断演进和互联网应用的复杂化&#xff0c;前端工程化也逐渐成为了前端开发的重要领域。以下是前端工程化的主要发展里程…

RTSP流媒体服务器EasyNVR安防视频云平台视频流分享到iOS设备上但画面出现拉伸的问题解决方案

EasyNVR是基于RTSP/Onvif协议的视频接入、处理及分发的安防视频云平台&#xff0c;可提供丰富且灵活的视频能力&#xff0c;包括&#xff1a;设备接入、实时视频直播、录像、云存储、录像回放与检索、告警、级联等。平台部署轻快、功能强大&#xff0c;在安防视频监控领域有着广…

诚迈科技携数智成果亮相南京软博会,交出数实融合圆满答卷

8月20-23日&#xff0c;南京软博会在南京国际博览中心盛大举行。诚迈科技聚焦数字中国建设需求和万物智联时代关键软件技术发展趋势&#xff0c;全方位展示了一系列操作系统产品和数智化解决方案成果&#xff0c;旨在推动数实融合创新。此外&#xff0c;诚迈科技受邀出席中国工…

Android面试题:MVC、MVP、MVVM

MVC模式&#xff1a; MVC结构&#xff1a; 1.MVC(Model-View-Controller) 2.Model:对数据库的操作、对网络等的操作都应该在Model里面处理&#xff0c;当然对业务计算&#xff0c;变更等操作也是必须放在的该层的。 3.View:主要包括一下View及ViewGroup控件&#xff0c;可以是…

视频云存储平台EasyCVR视频汇聚平台关于机电设别可视化管理平台可实施设计方案

随着工业化进程的不断发展&#xff0c;机电设备在各行各业中扮演着重要的角色。然而&#xff0c;由于机电设备种类繁多、数量庞大&#xff0c;包括生产机械、建筑器械、矿用器械、制药器械、食品机械等&#xff0c;传统的手动管理方式已经无法满足对设备进行精细化管理的需求。…

苹果手机怎么删除软件?教你1分钟搞定!

手机内存快不够用了&#xff0c;实在是不想删除手机里的重要数据&#xff0c;所以想卸载一些长时间不用的软件&#xff0c;有什么快速好用的方法能够安利一下吗&#xff1f; 买了新手机&#xff0c;第一件事当然是在手机上下载各种各样的软件供自己使用和娱乐。但当过了一段时间…

基于jenkins构建生成CICD环境

目录 一、安装配置jenkins 1、环境配置 2、软件要求 3、jdk安装&#xff08;我是最小化安装&#xff0c;UI自带java要先删除rm -rf /usr/local/java 4、安装jenkins-2.419-1.1 二、Jenkins配置 1、修改jenkins初始密码 2、安装 Jenkins 必要插件 3、安装 Publish Over SS…