《洛谷深入淺出基礎篇》P1113 雜物——DAG

上鏈接:P1113 雜務 - 洛谷 | 計算機科學教育新生態 (luogu.com.cn)icon-default.png?t=N7T8https://www.luogu.com.cn/problem/P1113

?上題干:

題目描述

John 的農場在給奶牛擠奶前有很多雜務要完成,每一項雜務都需要一定的時間來完成它。比如:他們要將奶牛集合起來,將他們趕進牛棚,為奶牛清洗乳房以及一些其它工作。盡早將所有雜務完成是必要的,因為這樣才有更多時間擠出更多的牛奶。

當然,有些雜務必須在另一些雜務完成的情況下才能進行。比如:只有將奶牛趕進牛棚才能開始為它清洗乳房,還有在未給奶牛清洗乳房之前不能擠奶。我們把這些工作稱為完成本項工作的準備工作。至少有一項雜務不要求有準備工作,這個可以最早著手完成的工作,標記為雜務?11。

John 有需要完成的?n?個雜務的清單,并且這份清單是有一定順序的,雜務 k?(k>1)?的準備工作只可能在雜務?1?至k?1?中。

寫一個程序依次讀入每個雜務的工作說明。計算出所有雜務都被完成的最短時間。當然互相沒有關系的雜務可以同時工作,并且,你可以假定 John 的農場有足夠多的工人來同時完成任意多項任務。

輸入格式

第1行:一個整數n?(3≤n≤10,000),必須完成的雜務的數目;

第?22?至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 07 4 3 5 6 0

輸出 #1復制

23

這道題我們將樣例給的圖在草稿上畫成一個圖就能解決了。

我們由題意可以知道,這種有些任務都有前置條件的情況,所有任務完成的時間,取決于最慢的那個任務。

所以我們只需要找到離1最遠的那個點就可以了,也就是找一根最長的鏈。

所以可以用深度優先遍歷+記憶化,這樣每次搜索到同一個點就不需要再次往下搜索了。

由于是深搜,我們最開始得到的時間必然是最底部的雜物完成所需的時間。

建立一個數組儲存時間,flag[x] ,? ?代表這個點x到底部所需要的時間

再建立一個數組time【x】來儲存每個雜物所需要的時間。

所以現在flag【7】=4,代表從雜物7開始到底部所需要的時間為4

對于上一層的flag? ,需要選擇上一層的分支中最長的那一個,即flag【3】=max( dfs(分支),flag[3])

遍歷上一層的每一個分支,得到最長的分支,然后再加上本身的時間? flag【3】+=time【3】

這樣的話,3到底部的最長的那一條分支就找到了。

?

接著返回上一層:2

以此類推。

記著在dfs最開始的 地方加一個判斷語句,if(flag【x】)return flag【x】;

目的是記憶化,減少遞歸次數

我們可以得到下面的代碼:


const int N = 1e4 + 10;
int flag[N],times[N];
vector<int > p[N];
int  n,ttop;int dfs(int id)
{if (flag[id])return flag[id];for (int i = 0; i < p[id].size(); i++) {flag[id] = max(flag[id], dfs(p[id][i]));}flag[id] += times[id];return flag[id];
}int main()
{cin >> n;int temp = n;while (temp--){int u, v;cin >> u >> times[++ttop];for (; cin >> v;)if (v == 0)break;else p[v].push_back(u);}cout<<dfs(1);
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/163394.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/163394.shtml
英文地址,請注明出處:http://en.pswp.cn/news/163394.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

編寫SQL語句,場景:從一張表中查詢某字段是逗號分隔的集合值,需要遍歷集合內每個值,將其作為條件去查詢另一張表,最終返回列表

目錄 場景編寫SQL分頁獲取該開票單號下的所有訂單列表使用子查詢和 in 字句使用 find_in_set 場景 從一張表中查詢某字段是逗號分隔的集合值&#xff0c;需要遍歷集合內每個值&#xff0c;將其作為條件去查詢另一張表&#xff0c;最終返回列表 編寫SQL 分頁獲取該開票單號下…

羊大師詳解羊奶如何幫助控制血壓

羊大師詳解羊奶如何幫助控制血壓 羊奶是一種珍貴的天然飲品&#xff0c;不僅具有豐富的營養成分&#xff0c;還被證實對血壓具有調控作用。很多人在了解到羊奶的功效后&#xff0c;都對其與血壓之間的關系產生了濃厚的興趣。接下來&#xff0c;小編羊大師將為大家詳細介紹羊奶…

Linux基本命令與系統題目

1.linux 2.6.* 內核默認支持的文件系統有哪些&#xff1f;[多選] A.ext3 B.ext2 C.ext4 D.xfs E.ufs 2.linux查看cpu占用的命令是什么&#xff1f; A.top B.netstat C.free D.df 3.在Linux系統中, 為找到文件try_grep含有以a字母為行開頭的內容, 可以使用命令&…

算法復雜度分析

文章目錄 有數據范圍反推算法復雜度以及算法內容一般方法遞歸 有數據范圍反推算法復雜度以及算法內容 c一秒可以算 1 0 7 10^7 107~ 1 0 8 10^8 108次 一般方法 看循環 有幾層循環就可以初步分析O( n i n^i ni) 雙指針算法除外O(n) 遞歸 公式法 根據公式的形式&#xff0…

ARM 匯編基礎

我們在學習 STM32 的時候幾乎沒有用到過匯編&#xff0c;可能在學習 UCOS 、 FreeRTOS 等 RTOS 類操作系統移植的時候可能會接觸到一點匯編。但是我們在進行嵌入式 Linux 開發的時候是絕 對要掌握基本的 ARM 匯編&#xff0c;因為 Cortex-A 芯片一上電 SP 指針還…

關于前端上傳

類似于 上面的傳參form-data形式&#xff0c;第一個參數為上傳的文件&#xff0c;第二個參數為json格式

一篇搞定Java注解

參考&#xff1a;https://blog.csdn.net/yeahPeng11/article/details/120394276 https://blog.csdn.net/yeahPeng11/article/details/120330630 https://www.cnblogs.com/CF1314/p/16580232.html 通過現有注解&#xff0c;明白注解是什么東東。 在 SpringBoot中&#xff0c;我…

G320E是一種低榮聲、固定頻率的電荷泵型DC/DC轉換器

G320E 低噪聲電荷泵DC/DC轉換器 產品概述&#xff1a; G320E是一種低榮聲、固定頻率的電荷泵型DC/DC轉換器&#xff0c;在輸入電壓范圍在2.7V到5.0V的情況下&#xff0c;該器件可以產生5V的輸出電壓&#xff0c;最大輸出電流達到300mA.G320E外部元件少&#xff0c;非常適合于…

IP定位揭秘:如何揪出SEM、百度競價惡意點擊

在當今的數字營銷領域&#xff0c;搜索引擎營銷&#xff08;SEM&#xff09;和百度競價成為了企業推廣的重要手段。然而&#xff0c;隨著這些渠道的普及&#xff0c;惡意點擊現象也日益嚴重。惡意點擊主要來自競爭對手&#xff0c;或是競價服務的提供商&#xff0c;他們通過點擊…

亞信安慧AntDB MTK數據同步工具之數據稽核

數據稽核是一種用于確保表數據準確性和一致性的重要方法&#xff0c;它涉及到檢查數據的完整性、一致性、有效性和合法性&#xff0c;以及與預期規范的匹配程度等多個方面。隨著大數據時代的到來&#xff0c;通過有效的數據稽核&#xff0c;組織可以提高決策的準確性和效率&…

淺談安科瑞直流電表在荷蘭光伏充電樁系統中的應用

摘要&#xff1a;本文介紹了安科瑞直流電表在荷蘭光伏充電樁系統中的應用。主要用于充電樁的電流電壓電能的計量。 Abstract: This article introduces the application of Acrel DC meters in PV charging pile system in Netherlands.The device is measuring current,volt…

Modbus-RTU協議講解與實戰

1、背景 工作需要,需要使用Modbus-RTU實現RS485通信,于是簡單學習并實踐了一下。 2、參考資料 一文看懂Modbus協議 3、協議說明 3.1、協議類型 當前設備采用Modbus-RTU協議,采用CRC-16_Modbus校驗算法,數據鏈路層使用用標準串口協議,物理層采用RS485進行數據傳輸。 …

python變量、常量、數據類型

一、變量 變量是存儲在內存中的值&#xff0c;這就意味著在創建變量時會在內存中開辟一個空間。 基于變量的數據類型&#xff0c;解釋器會分配指定內存&#xff0c;并決定什么數據可以被存儲在內存中。 因此&#xff0c;變量可以指定不同的數據類型&#xff0c;這些變量可以…

開源Flutter on Desktop項目-極擴安卓開發者工具

極擴-安卓開發者工具 他能干嘛 這個Flutter on Desktop桌面項目可以輔助你開發APP&#xff0c;支持分析一些運行數據以及操作APK安裝等功能&#xff0c;甚至我還加入了Window安卓子系統的功能。 在它的幫助下&#xff0c;你可以快速查看當前正在運行的Activity&#xff0c;給你…

ubuntu/windows/mac小問題記錄

ubuntu刪除snap&#xff0c;釋放dev/mapper/ubuntu–vg-ubuntu–lv使用率100%問題。 當無法用常規方式卸載snapd。粗暴&#xff1a; 刪除 Snap 的目錄 rm -rf ~/snap sudo rm -rf /snap sudo rm -rf /var/snap sudo rm -rf /var/lib/snapd sudo rm -rf /var/cache/snapd刪除 S…

Oracle時間排序字段

要用 TIMESTAMP(6) 不要用 date 因為 date只到秒 &#xff0c;排序不準確

開發外賣霸王餐返利小程序的步驟有哪些?

外賣霸王餐返利小程序是一種基于社交電商模式的小程序&#xff0c;主要實現用戶和商家的共贏。 開發外賣霸王餐返利小程序的方案可以包括以下幾個步驟&#xff1a; 1、需求分析 明確外賣霸王餐返利小程序的功能和特點。確定用戶可以參與的活動類型、返利規則、用戶界面設計等…

Jmeter 分布式壓測

為什么要分布式 jmeter是100%純java開發的程序&#xff0c;虛擬用戶是以線程實現的&#xff0c;在大量并發情況下&#xff0c;很容易出現CPU、內存消耗過大的問題&#xff0c;甚至會出現java內存溢出。一般一臺電腦設置500-600線程數即可&#xff0c;如果超過1000線程&#xf…

vue - - - - - vue-qr插件生成二維碼

vue-qr插件生成二維碼 1. 安裝插件2. 組件使用示例圖&#xff1a;掃碼結果 1. 安裝插件 【vue-qr 官網地址】 npm install vue-qr --save // or yarn add vue-qr --save2. 組件使用 <template><vue-qr :logo-src"logoSrc":size"237":margin&qu…

php一句話木馬免殺

php一句話木馬免殺 針對于php一句話木馬做免殺&#xff1a; 利用php動態函數的特性&#xff0c;將危險函數拆分成字符&#xff0c;最終使用字符串拼接的方式&#xff0c;然后重新拼接&#xff0c;后加括號執行代碼&#xff0c;并且可以使用花指令進行包裝&#xff0c;如無限i…