ジム - 102307G卒業トポロジカル整列

ジム- 102307Gの   卒業 

質問の意味:十分に修復する必要がありnは卒業するためには、もちろんxjl、当然のいくつかは、ファーストクラスのコースです、そして彼のエネルギーは限られている、唯一のxjlは大学院への学期の最小数を必要と聞いて、学期のコースごとにKを修復することができます。

一点毎の除去は、ポイントが限定されることなく放出されるように、まず、nは正図の対であり、ポイントは、次いで逆図が構築され、複数の点に限定されます。

解決策1:我々は1の深さとして画像を入力していないので、あなたは、現在選択されているK-ダイレクトに等しい未満を指すことができますので、もし新しい数字は、人々の深さの最高点ではありませんこれらの点を完了取ることです

だから、kよりも多くのときには、私たちの自然の原理に基づいて選択の高い深さを逆にすることです。

1の#include <cstdioを>
 2の#include <ベクトル>
 3の#include <キュー>
 4の#include <アルゴリズム>
 5  使って 名前空間STDを、
6  のconst  int型 N = 1E4 + 11 7  構造体ノード{
 8      int型のID、DEP。
9      ノード(){}
 10      ノード(INT ID、INT DEP):ID(ID)、DEP(DEP){}
 11      ブール 演算子 <(constのノード&N1)のconst {
 12          リターン DEP < n1.dep。
13      }
 14  }。
15  int型N、K、NE [N]、RA [N]。
16ベクター< INT > VV [N]。
17の ボイド DFS(INT U){
 18      であれば(VV [U] .size()== 0 ){
 19          RA [U] = 1 20          リターン;
21      }
 22      のためのint型 I = 0 ; I <(INT)VV [U] .size(); iは++ ){
 23の         DFS(VV [U] [I])。
24個の          RA [U] = MAX(RA [U]、RA [VV [U] [I] + 1 )。
25      }
 26  }
 27  int型TP(){
 28      キュー< INT > Q。
29      PRIORITY_QUEUE <ノード> QQ;
30      のためには、int型 i = 1 ; iが<= N; iが++)場合(!qq.push(ノード(I、RA [I]))NE [I])。
31      INT ANS = 0、CNT = 0 、U、V。
32      ながら(!qq.empty()){
 33の          ANS ++ 34          CNT = 0 35          ながら(!qq.empty()&& CNT < K){
36              CNT ++ ;
37              q.push(qq.top()同上)。
38              qq.pop()。
39          }
 40          ながら(!q.empty()){
 41              、U = q.front()。
42              q.pop()。
43              のためには、int型 I = 0 ;(INT iはVV <)[U] .size(); iは++ ){
 44                  、V =のVV [U] [I]。
45                  qq.push(ノード(V、RA [V]))。
46              }
 47          }
 48      }
 49      リターンANS;
50  }
 51  INT メイン(){
 52      ながら(〜のscanf(" %d個の%のD "、&​​N&K)){
 53          のためにint型 i = 0 ; I <= N; iが++ )VVを[I] .clear( );
54          のためにint型 i = 1 ; iが<= N; iが++ ){
 55              のscanf(" %dの"、およびNE [I])。
56              もし(NE [i]が!)続けます57の             VV [NE [I]一back(I)。
58          }
 59          int型 i = 1 ; iが++; iが<= N)であれば(!NE [i])とDFS(I)。
60          のprintf(" %d個の\ n " 、TP())。
61      }
 62      リターン 0 63 }
nlogn

対処方法2:レッスンはkよりも少ない数の前にそのコースの別の説明に早い段階で学習されたときに、各コースは、最速の学期はその深さに依存して学ぶことができ、それらの教訓は、直接になります層として。

1 <cstdioを>含む
 2の#include <ベクトル>
 3の#include <キュー>
 4の#include <アルゴリズム>
 5  使って 名前空間STDを、
6  のconst  int型 N = 1E4 + 11 7  INTの N、K、[N]、NE [N]、RA [N]。
8ベクトル< 整数 > VV [N]。 
9  int型TP(){
 10      キュー< INT > Q。
11      のためにint型 i = 1 ; iが<= N; iが++)場合(!における{[i])と
12個の          RA [I] = 1 13          q.push(I)。
14      }
 15      INT ANS = 0、CNT = 0 、U、V。
16      ながら(!q.empty()){
 17          、U = q.front()。
18          q.pop()。
19          CNT ++ ;
20          であれば(CNT == 1 ++ ANS) 21          であれば(CNT == k)は、CNT = 0 22          であれば(RA [U]> ANS)ANS ++、CNT = 1 23          のためのint型 I =0、I '(INT)VV [U] .size(); iが++ ){
 24              、V =のVV [U] [I]。
25個の              RA [V] = MAX(RA [V]、RA [U] + 1 )。
26               [V] - 27              もし(!q.push [V])(V);
28          }
 29      }
 30の     リターンANS。
31  }
 32  INT メイン(){
 33      ながら(〜のscanf(" %D%dの"、&​​N&K)){
 34          のためには、int型、I = 0 ; I ++; iが<= N){
 35              における [I] = RAの[I] = 0 ;
36の             VV [I] .clear();
37          }
 38          のためのint型 i = 1 ; iが<= N; iが++ ){
 39              のscanf(" %dの"、およびNE [I])。
40              もし(NE [i]が!)続けます41               [I] ++ ;
42の             VV [NE [I]一back(I)。
43          }
 44          のprintf(" %Dを\ n " 、TP())。
45      }
 46     リターン 0 ;
47  }
 48  / * 
49  4 2
 50  4 4 4 0
 51  * /
n個

 

おすすめ

転載: www.cnblogs.com/LMCC1108/p/11672321.html