思考DFSのZOJ 4124 +トポロジカルソート

4124 -ハプニング  中央値

  タイトル効果は:n個の要素は、mは、関係A> Bとが与えられており、の要素は(N + 1)/ 2個の要素から求められることがあり、要素が出力に対応する位置に、出力0、およびその逆であってもよいです

  省、過去二週間の最後の2つが、今、私はこのタイトルを記入し、このタイトルを感じることは難しいことではありませんが、その時は明らかに質問の意味を理解していなかった、彼の心を混合してもよいですトピックによると、関連するトポロジカルソートでこれを見やすいですが、トポロジカルソートの役割は、判決を探していることも、主に考えて最初の(N + 1)/ 2素子であってもよい関係が矛盾して与えられたかどうかを決定することです。

  (N + 1)/ 2の要素とすることができる中間要素は、その要素(それよりも大きい)の数と(それよりも小さい)その背後にある要素の数よりも大きくないとその前に明らかに不確かより(N-1)/ 2番目の要素、残りは、その要素がまたはそれ前後に任意のアップすることができ、よりも大きいか小さいからです。だから我々は、に対処するために、DFSを使用することができ、また、後者の要素の数は、それの前の任意のノードには明らかです。右上の任意のノードが、より小さな要素のビビの小さい要素は、その特定の操作ので、我々は、各要素xについて、それが各より小さいために推論することができるDFS、それよりも確実に小さい、そのしかし、yが更新された要素をマークしていなかった、それは要素x ++と++ yの前の要素の後ろにあり、最終的にxがyよりも大きいマーク。

  詳細については、多くはない側面ので、私はスターに無用の前にベクトルを向け、コードを参照してください。

1の#include <cstdioを>
 2の#include <ベクトル>
 3の#include <キュー>
 4  使って 名前空間STDを、
5  のconst  int型 N = 118 6ベクター< INT > VV [N]。
7  BOOL大きい[N] [N]。// 大きな[I] [J]就标记私是否比jの大
8  INT デュ[N]、VIS [N]、あらかじめ[N]、バック[N];
9  ボイドのinit(int型N)
 10  {
 11      のためのint型 I = 0 ; iが<= N; iが++ 12      {
13          デュ[I] = 0 ;
14          VIS [I] = 0 ;
15          プレ[i]はバック= [I] = 0 ;
16の         VV [I] .clear();
17          のためにINT J = 0 ; J <= N; J ++ 18              ビッグ[i]は[j]は= 19      }
 20  }
 21  BOOL TP(INT N)
 22  {
 23      キュー< INT > Q。
24      のためにINT I = 1; iが<= N; iは++ 25          であれば(DU [i]が<= 0 &&!VIS [I])
 26          {
 27              VIS [I] = 1 28              q.push(I)。 
29          }
 30      int型の和= 0 、X、Y。
31      ながら(!q.empty())
 32      {
 33          、X = q.front()。
34          q.pop()。
35          合計++ ;
36          のためには、int型、I = 0 ; iが<[X] .size()VV; iが++ 37         {
 38              のY =のVV [X] [I];
39              デュ[Y] - 40              であれば(DU [Y] <= 0 &&!VIS [Y])
 41              {
 42                  VIS [Y] = 1 43                  q.push(Y)。 
44              }
 45          }
 46      }
 47      リターン和== N。
48  }
 49の 空隙 DFS(INT U、INT F)
 50  {
 51      のためにINTを= I 0、Iは<VV [U] .size(); I ++は52である     {
 53は         int型 V = VV [U] [I]、
 54は         IF!(ビッグ[F] [V])// F> Vしかし標識されていない、それを更新することができる
55          {
 56である              [F] [V] =ビッグtrueに57は、              予め[V] ++; // フロント++ Vの要素数
58              ;戻る[F] ++ // 後F要素の数- 
59              DFS(V、F);
 60          }
 61れる     }
 62である }
 63は、 INT (メイン)
 64  {
 65      INTT、N、M、U、V。
66      のscanf(" %dの"、&T)。
67      一方(t-- 68      {
 69          のscanf(" %D%dの"、&​​N、&M)。
70          INIT(N)
71          一方(M-- 72          {
 73              のscanf(" %D%dの"、&​​U、およびV)。
74              デュ[V] ++ ;
75の             VV [U] .push_back(V)。
76          }
 77          であれば(!のTP(n))を// 関係のトポロジカルソートが競合賞にするかどうかを
78          {
 79              のためにINT I = 1 ; I <= N; I ++は80                  のputchar(' 0 ' );
 81              プット("" );
 82          }
 83を         他の
84          {
 85              INT I = 1 ; I <= N-Iが++ 86                  DFS(I、I);
 87              INT I = 1 ; I <= N; I ++は88                  IF([I] <=(N-プレ1)/ 2バック&& [i]は<=(N- 1)/ 2 89                      のputchar(' 1 ' )。
90                  他の
91                      のputchar(' 0 ' );
92の              プット("" );
93          }
 94      }
 95      リターン 0 96 }
あなたの心の層トポロジによって層

 

おすすめ

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