P1113の雑用(トポロジカルソート)

質問の意味:

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; 
 }

 

おすすめ

転載: www.cnblogs.com/overrate-wsj/p/12309442.html