BFSを使用してトポロジカルソートを求めてhdu1532

トピックリンク:http://acm.hdu.edu.cn/showproblem.php?pid=1285

タイトルは、辞書最小のトポロジー構成を与えるために必要なポイントの間のいくつかの順序を与えます。トポロジカルソート問題については、我々はDFSとBFSを解決することができる持っているが、問題はDFS上でのみ深さはそれらの間であると言うことです根の間の距離に比較して1つのノードと次の層のノードを、処理することができます注文は、同じレベルのために、そこには順序がありませんが、我々はBFSとトラバーサル、およびキューはプライオリティキューになりソートトポロジカルを求めて、元のBFSを考えてBFSは、層との関係を持って扱うことができます。だから我々は、出力にそれぞれの層に優先順位辞書的に小さいノードを選択することが可能となります。

コードは以下の通りであります:

1の#include <ビット/ STDC ++ H>
 2  使用して 名前空間STDを、
3符号なしのtypedef int型のUI。
4のtypedef 長い LL。
5符号なしのtypedef 長い 長いULL。
6  の#define PFのprintf
 7  の#define MEM(A、B)のmemset(A、B、はsizeof())
 8  の#define prime1 1E9 + 7
 9  の#define prime2 1E9 + 9
 10  の#define PI 3.14159265
 11  の#define LSON Lを、半ば、室温<< 1
 12  の#define rson半ば+ 1、R、RT << 1 | 1
13  の#define scand(X)のscanf( "%のLLF"、&x)は 
 14  の#define F(I、B)のための(INT iは=; I <= B; I ++)
 15  の#defineスキャン()のscanf( "%のD"、&)
 16  の#define MP(a、b)はmake_pair(()、(B))
 17  の#define P対<整数、整数>
 18  の#define DBG(引数)COUT <<#1引数<< ":" <<引数<<てendl;
19  の#define INF 0x3f3f3f3f
 20  CONST  INT MAXN = 505 21  整数N、M、T。
22インラインintはREAD(){
 23      INT ANS = 024      CHAR CH = GETCHAR()。
25      一方(isdigit(CH)!){ 場合(CH == ' - ')W = - 1 ; CH = GETCHAR();}
 26      ながら(isdigit(CH))ANS =(ANS << 3)+(ANS << 1)+ CH- ' 0 '、CH = GETCHAR()。
27の     リターン ANSは* wは、
28  }
 29  構造体ノード{
 30      INT U、V。
31  } P [MAXN]。
32  int型電子。
33  INTVIS [MAXN] [MAXN]、ヘッド[MAXN]、NXT [MAXN]  [MAXN]、NUMは[MAXN]; // 度で表し
34が ボイド(INIT)
 35  {
 36      E = 0 ;
 37 [      MEM(VIS 、0); MEM(ヘッド、 - 1。); MEM(NXT、 - 1。); MEM(0 );
 38である      MEM(NUM、0); // ゼロランキング情報
39  } 
 40  空隙 addedge(INT Uを、int型V)
 41は 、{
 42が      P [E] .U = U;
 43のIS     P [E] .V = V;
 44である      NXT [E] = ;頭部[U]
 45      頭[U] = E ++ ;
 46である }
 47  ボイドtopsort()
 48  {
 49      PRIORITY_QUEUE < INT、ベクトル< INT >、大< INT >> Q; // 最小ヒープ
50      F(I、1 、N-)
 51は     、{
 52で         IF [I] == 0 q.push(I)); // 辞書式順序の列の零点プライオリティキュー
53である     }
 54である     INT = T 0、ID。// ソートが完了した後にキューからBFSを用いて扱う配列topsort点は、実際に持っている必要がありtopsort 
55      ながら(!Q.empty())
 56である     {
 57である          NUM [T ++] = ID = q.top() ;
 58          q.pop()を、
 59          のためにINT I =ヘッド[ID];〜I; IはNXTを= [I])を// 走査のこの時点からすべての側面
60          {
 61である              [P [I]。 V] - ; // 浸透がポイントに低減さ
62で             IF [P [I] .V] == 0)q.push(P [I] .V); //は度であります0プライオリティキューに含まれる点
63          }
 64       }
 65      //全ての点が走査された後、特定のトポロジカル順序ので、直接出力ので、
66       PF(" %のD " NUM、[ 0 ]);
 67       F(I、1、N- 1)PF(" %のD " 、NUM [I]);
 68       PF(" \ N- " ); 
 69  }
 70  のint main()の
 71である {
 72      // freopenは( "INPUT.TXT"、 "R&LT"、STDIN);
 73である     // freopenは(「出力.TXT "" W」、STDOUT); 
74      STD :: :: iOSのsync_with_stdio(falseに)。
75      しばらく(scanf関数("%D%D 、およびN-、&M)=!EOF)
 76      {
 77              のinit();
 78              int型A、B;
 79              F(I、1 、m)の
 80              {
 81                  A =読む()、B = 読みます() ;
 82                  IF(VIS [A] [B]!)// 両側の間のみ有向エッジを保証する、またはアクセスの程度は誤差を生じる、変化する
83                  {
 84                      addedge(B);
 85                      VIS [A] [B] = 1 ;
 86                       [B] ++ ; 
 87                  }
 88              }
 89               topsort()。 
90      }
 91  
92 }

 

おすすめ

転載: www.cnblogs.com/randy-lo/p/12577618.html