HDU 5971「レスリングの試合」(二部グラフ彩色)

 

ポータル

 

•問題の意味

  N所与の個体、Mゲーム。

  これメートルのレース、すべてのゲームに2つの戦い、別の「悪いプレイヤー」に属する「良い選手」の一環。

  あなたは既に確立されている「良い選手」とyの数が「悪い選手を」同定されているxは与えます。

  Q.私は2つのカテゴリの一つが「良い選手」に属し、他は「悪いプレイヤー」に属しているにこれらの個人をn個のことができます。

  「良い選手」と「悪いプレーヤー」に属するの一部である者がないこと。

  もしそうなら、出力「YES」、逆に、出力は「NO」。

•問題解決

  2のすべてのゲームのために$ U、Vの$、$ uはRIGHTARROWのVの\を\でも双方向側、の\ V \ RIGHTARROW U $;  

  そして、DFS染色。  

  それらの既に識別$ X + Yの$で始まる、人々、矛盾出力「NO」に関連した染色、始まりました。 

  そして、人々のための不確実、列挙染色、矛盾出力「NO」。

  矛盾が存在しない場合は、出力「YES」。

•コード

1つの#include <ビット/ STDC ++ H>
 2  使用して 名前空間STDを、
3  のconst  int型 N = 1E3 + 50 4  のconst  int型 M = 1E4 + 50 5  
6  INTのN、M、X、Y。
7  のint NUM;
8  int型ヘッド[N]。
9  構造体のエッジ
 10  {
 11      INT に、
12      int型の次。
13 } G [M << 1 ]。
14  ボイド addEdge(int型のu、int型V)
 15  {
 16      G [NUM] = {V、ヘッド[U]}。
17      頭[U] = NUM ++ 18  }
 19  のint COL [N]。/// 0:良好、1:不良
20  のint G [N]。
21  int型B [N]。
22  BOOL OK。
23  
24  空隙 DFS(int型 U、int型のフラグ)
 25  {
 26      COL [U] = フラグ。
27      のためにint型、〜iは&& OK;!私=私は=頭部[U] G [i]は.next)
 28      {
 29          INT= V G [I] .TO;
 30          
31は、         IF(COLが[V] == - 1 32              DFS(V、^内のフラグ。1 )、
 33は             
34れる         IF(COL [V] == COL [U])/// U、Vの反対、もしCOL [U] = COL [V ] 矛盾現れる
35              OK = trueにする;
 36      }
 37  }
 38である CHAR * )(解決
 39  {
 40      のためにINT I = 1 ; Iは、= Xを<; ++ I)
 41は     、{
 42が         INT U = G [I];
 43は          OK =;
44          であれば(COL [U] == - 1 45              DFS(U、0 );
46          であれば(OK || COL [U] == 1 47              リターン " NO " 48      }
 49      のためのint型 i = 1 ; iは= yと<; ++ I)
 50      {
 51          INT U = B [i]は、
52          であれば(COL [U] == - 1 53              DFS(U、1 )。
54  
55          もし(OK || COL [U] == 0 56              リターン " NO " 57      }
 58      のためのint型 i = 1 ; iは= N <; ++ I)
 59      {
 60          = OK 61          であれば(COL [I] == - 1 &&ヘッド[I] =! - 1 62              DFS(I、0 );
63              
64          もし(OK)
 65              リターン " NO " 66      }
 67      リターン YES 68  }
 69  ボイドは、init()
 70  {
 71      NUM = 0 72      のためには、int型 = Iを0 ; iが= N <; ++ I)
 73      {
 74          COL [I] = - 1 75          [I] =ヘッド- 1 76      }
 77  }
 78  のint main()の
 79  {
 80  //     freopenは( "C:\\ユーザー\\ hyacinthLJP \\デスクトップ\\で&&アウト\\コンテストC ++ワークスペースを\\"、 "R"、STDIN)。
81     一方、(〜のscanf(" %D%D%D%D "、&​​N、&M、およびX&Y))
 82      {
 83          は、init();
84          のためにint型 I = 1 ; I <= M; ++ i)が
 85          {
 86              のint U、V。
87              のscanf(" %D%dの"、&​​U、およびV)。
88              addEdge(U、V);
89              addEdge(V、U)。
90          }
 91          のためにINT i = 1 ; iは= xを<; ++ I)
 92             scanf関数(" %dの"、G + I)。
93          のためにint型 i = 1 ; iが= Yを<; ++ i)が
 94              のscanf(" %dの"は、B + I)。
95の         プット((解決))。
96      }
 97      リターン 0 98 }
コードの表示

 

おすすめ

転載: www.cnblogs.com/violet-acmer/p/11785602.html