質問の意味:
n個のタスクがあり、それぞれがその必要な完了時間を持っており、その前身は、すべてのタスクを完了するために、持っている(直接同時に開始できるタスクに関連していない)どのくらい尋ね
アイデア:
あなた自身の少しより複雑書きます
最初の前任者(正面からでも自分自身に)も有向エッジの全てのミッションのために、マップに内蔵、及び記録点に読み込ま
再び通過する前に、0度点を低減する程度に、すべての隣接するエッジ点、0点の場合度、キューの添加キューに追加されます
より重要な点は、更新する方法である[NEX = MAX(DP DP [NEX]、DP [I] +ティム[NEX])
私の書き込みは直接配列を扱うことができるようになりますDPで、時間のセーブつ以上のキューに、より複雑です
書式#include <iostreamの> の#include <アルゴリズム> 書式#include <キュー> の#include <ベクトル> の#include <cstdioを> する#include <CStringの> に#define INF 0x3f3f3f3f 使用して 名前空間をSTD。 const int型 MAXN = 1E5 + 10 。 キュー < 整数 > A、B; ベクター < INT > エッジ[MAXN]。 INT における[MAXN]、ティム[MAXN]、ANS、nは、MX [MAXN]。 ボイド)(解く { ため(INT iは= 1 ; I <= N; I ++){ 場合(!で[I]){ a.push(I)、b.push(TIM [I])。 } } ながら(!a.empty()){ int型のx = a.front()、Y = b.front()。 a.pop()、b.pop()。 ANS = MAX(ANS、Y)。 以下のために(INT iが= 0 ; I <エッジを[X] .size(); I ++ ){ で [エッジ[X] [I]] - 。 MX [エッジ[X] [I] = MAX(Y、MX [エッジ[X] [I])。 もし(!で[エッジ[X] [I]]){ a.push(エッジ[X] [I])。 b.push(ティム[エッジ[X] [I] + MX [エッジ[X] [I])。 } } } } int型のmain() { int型、X、Y、TEMP; scanf関数(" %のD "、&N) 以下のために(INT iが= 1 ; I <= N; I ++ ){ scanf関数(" %D%D "、およびX&Y)。 ティム[X] = Y。 一方、(scanf関数(" %のD "、および温度)&& TEMP){ エッジ[TEMP] .push_back(X)。 [X] ++ ; } のmemset(MX、 -INF、はsizeof (MX))。 ANS = - infファイル。 解決する(); coutの << ANS << てendl; }