ジム- 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 }
対処方法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 * /