リンクします。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 }