codeforces 1282 E.ザ・ケーキは嘘です(DFS +构造)

リンクします。https://codeforces.com/contest/1282/problem/E

質問が意図される:N角形の平面図であるために、各切断ナイフは、三角形、N-2の三角形への最終的なカットを切り出すことができます。タイトル番号を3つの三角カットの頂点、及び三角形の数を与えます。順次ご三角形のカットを依頼し、順次すべてのポリゴンの頂点の元の数nを出力し、逆もまた出力を順次出力することができます。

ソリューション:やや似トポロジカル整列。まず、入力3三角形の点A、B、C、統計V []はXORが値Vを確保することができるのXOR C、共感統計V [B]、V [C]、[I] bは0のみですXORは、2つの点に接続されたIは、共通の三角形の側面があっても、複数のポイントを排除XOR公共側が接続されています。このプロパティによると、それはすべてのポイントの出力シーケンス番号することができます。

         それでは、どの三角形のシーケンス出力していますか?エッジは、その2つの一般的な三角形を発見された場合、最初に、そうツリー構造である図を形成するノードとして三角形は、我々は簡単に見つけることができることは、このエッジに基づいて2つの三角形に接続することができます。リーフノードは、開始DFSリーフノード番号から再びトラバースは、出力三角形であってもよいです。

ACコード:

1つの#include <iostreamの>
 2の#include <ベクトル>
 3。の#include <CStringの>
 4。の#include <地図>
 5。の#include <アルゴリズム>
 6。 使用した 名前空間STD;
 7  CONST  INT MAXN = 1E + 5 ;
 8  int型V [MAXN]。
 9ベクトル< INT > G [MAXN];
 10  INT 訪問[MAXN];
 11の 空隙 DFS(INT X){ // リーフノードは、常に、最も外側の三角形を表すので、それはの一つであり、リーフノードから検索
図12は、ある      訪問[X] = 1 ;
 13である     ためINTは iは= 0 ; I <G [X] .size(); I ++ ){
 14          INT CUR = G [X] [I];
15          であれば(訪問[CUR] == 0 )DFS(G [X] [I])。
16の //         DFS(G [X] [I])。
17      }
 18      COUT << X << "  " 19  }
 20  int型のmain(){
 21      のint T; CIN >> T。
22      一方(t-- ){
 23          INT N。
24          CIN >> N。
25          のためのint型= I 0、Iは<=はMAXN; I ++ ){
 26が              V [I] = 0 ; // 配列V初期化
27              ログイン[I] = 0 ; // 初期アクセスのアレイ
28              G [I] .clear();
 29          }
 30          地図<ペア< 整数整数 >、ベクトル< INT >> MP;
 31である         ためINT Iは= 0、I <N- 2、I ++ ){
 32              、INT A、B、C、
 33である              CIN >> A >> B >> C;
 34             IF(A> B)スワップ(A、B);
 35              IF(B> C)スワップ(B、C);
 36              IF(A> B)スワップ(A、B);
 37 [              V [A] ^ = B、 V [A] ^ = C; // XOR演算
38である              V [B] = ^ V [B] = ^ A ; C
 39              V [C] ^ = A、V [C] ^ = B;
 40              MP [{ 、B}]一back(I +。1。); //は、片側A、B、及び共通三角I +を追加1。
41である              MP [{C}]一back(I +。1。 )、
 42である              MP [{B 、C}]一back(I +。1。 )、
 43である         }
 44は         、INT A、B。
45          のために{(MPオートH)
 46である             IF(h.second.size()== 1){ // 何気なくエッジを探し、三角形の共有のみ
47                  A = ; h.first.first
 48                  B = h.first .second;
 49              //     BREAK; 
50              }
 51である         }
 52れる          COUT A << << "  " << B; // エッジこと出力
53である         ためINT I = 0、I <N- 2、I ++ ){
 54は、             INT A = V ^ T [B]; //XORが運転を開始しました。詳細なペンは、このプロセスがより明確に理解何シミュレートすることができる
55              COUT << "  " << ; Tが
 56であり、              A = B、B = ; T
 57である         }
 58          COUT << ; ENDL
 59          のための{(MPオートH)
 60              IF(h.second.size()== 2 ){
 61が                 INT U = h.second [ 0 ]、V = h.second [ 1 ];
 62である                  G [U] .push_back(V)、G [V] .push_back (U); // 図内蔵点三角形に共通のエッジ
63である             }
 64          }
 65の          DFS(1。);
66          coutの<< てendl;
67      }
 68      リターン 0 69 }

おすすめ

転載: www.cnblogs.com/AaronChang/p/12130172.html