それはすべてを整理(+思考のトポロジカルソート)

異なる値の昇順にソート順序はより少なくよりオペレータの何らかの形態が最大に最小の要素を注文するために使用されるものです。例えば、ソートされたシーケンスA、B、Cは、DはA <B、B <CとCこの問題では、<D.は、私たちはあなたにフォームのA <Bの関係の集合を与え、決定をお願いすることを意味しますソート順が指定されているかどうか。

入力

入力は複数の問題のインスタンスで構成されます。各インスタンスは、2つの正の整数nとmを含む行から始まります。最初の値は、ここで、2 <= N <ソートする= 26オブジェクトは大文字アルファベットの最初のn文字になり、ソートするオブジェクトの数を示します。第2の値mが、この問題のインスタンスに説明する形態A <Bの関係の数を示します。大文字、文字「<」および第二大文字:次は、それぞれ含有するそのような関係は、3つの文字からなるm行であろう。いいえ文字はアルファベットの最初のn文字の範囲外になることはありません。N = M = 0の値は、入力の終了を示します。

出力

各問題インスタンスのため、出力が1行から成ります。この行は、次の3つのいずれかである必要があります。 

xxxに関係した後に決定されるソート順:YYY ... Y。 
ソートされた配列を決定することはできません。 
xxxの関係の後に見つかった矛盾。 

ここでxxxは時間のいずれかでソートされた順序で処理された関係の数に決定されるか、または矛盾は、いずれか早い方、見出し、... yはソート、昇順シーケンスYYYです。 

サンプル入力

4 6 
A <B 
A <C 
B <C 
C <D 
B <D 
A <B 
3 2 
A <B 
B < 
26 1 
A <Z 
0

サンプル出力

ABCD:4人の関係の後に決定されるソート順。
矛盾は2つのリレーション後に発見されました。
ソートされた配列を決定することはできません。
代码:
#include <cstdioを> 
する#include <iostreamの> 
する#include <CStringの> 
する#include <アルゴリズム> 
の#include <キュー> 
の#include <スタック> 
の#include <ベクトル> 
の#include <地図> 
の#include <cmath>
 CONST  INT MAXN = 1E5 + 5 ; 
typedefの長い 長いLL。
使用して 名前空間はstdを、
ベクター < INT > VEC [ 30 ]。
INTのN、M。
int型デュ[ 30 ]。
INTチュー[ 30 ]。
int型 DU1 [ 30 ]。
int型のフラグ。
ベクトル < int型 > ANS1。
ボイドTpsort()
{ 
    PRIORITY_QUEUE < int型、ベクトル< INT >、大きな< INT >> Q。
    PRIORITY_QUEUE < 整数 > Q1。
    
    int型 S = 0 ;
    INT T = 0、T <N; T ++ 
    { 
        場合(チュー[T] == 0 &&デュ[T] == 0 
        { 
         S =1 ;    
        } 
    } 
    のためのint型 T = 0、T <N; T ++ 
    { 
        DU1 [t]は = デュ[T]。
    } 
    のためのINT T = 0、T <N; T ++ 
    { 
        場合(DU1 [T] == 0 
        { 
            q.push(T)。
            q1.push(T)。
        } 
    } 
    ベクトル < 整数 > ANS、ANS2。
    しばらく(!q.empty())
    { 
        int型 =今)q.top(;
        INT now2 = q1.top()。
        q.pop(); 
        q1.pop(); 
        (今)ans.push_back。
        ans2.push_back(now2)。
        INT T = 0、T <VEC [今] .size(); T ++ 
        { 
            int型次= VEC [今] [T]。
            DU1 [次] - もし(DU1 [次] == 0 
            { 
                q.push(次)
                q1.push(次)
            } 
        } 
    } 
    もし(ans.size()!= N)
    { 
        フラグ =1 ; 
    } 
//     COUT << ans.size()<<」「<< S << ENDL。
     
    もし(ans.size()== N && S == 0 
    { 
        int型 SSS = 0 INT T = 0、T <ans.size(); T ++ 
        { 
            場合(ANS [T] =!ANS2 [T])
            { 
                SSS = 1 
            } 
        } 
        もし(SSSの== 0 
        { 
            フラグ = 2 以下のためのint型、T =0 ; T <ans.size(); T ++ 
            { 
                ans1.push_back(ANS [T])。
            } 
        } 
        
        
    } 
    
} 
INT ()は、メイン
{ 
  
   一方(CIN >> N >> M)
   { 
    場合(N == 0 && m個の== 0 
    { 
        破ります
    } 
    のためのINT T = 0、T <N; T ++ 
    { 
        VEC [T] .clear(); 
    } 
       チャー STR [ 5 ]。
       memset(DU、0はsizeof(DU))。
       memset(チュー、0はsizeof (チュー))。
       フラグ = 0 int型 SS = 0 ;
       int型のk; 
       ans1.clear(); 
       INT T = 1 ; T <= M; T ++ 
       { 
           scanf関数(" %sの" 、STR)。
           VEC [STR [ 0 ] - [ A ' ] .push_back(STR [ 2 ] - [ A ' )。
           デュ[STR [ 2 ] - [ A '] ++ ; 
           チュー[STR [ 0 ] - [ A ' ] ++ ;
           もし(SS)
           { 
           続けます
        } 
           Tpsort()。
           もし(フラグ== 1 
           { 
               のprintf(" 矛盾%dの関係の後に見つかった\ N。" 、T)。
               SS = 1 
        } 
        そう であれば(フラグ== 2 
        { 
            SS = 1 
            printf(%dの関係後に測定ソート順:、T)。 
            INT J = 0 ; J <nであり、j ++ 
            { 
                のprintf(" %のC "、ANS1 [J] + ' A ' )。
            } 
            のprintf(" \ N " )。
            
        } 
    } 
    もし(SS == 0 
    プット(" ソート順を決定することはできません。" )。
    
   } 
   戻り 0 
}

 

おすすめ

転載: www.cnblogs.com/Staceyacm/p/11261298.html