https://ac.nowcoder.com/acm/contest/886#question
疑いが隣接行列G及びGマップの出力H中に存在する場合、その相補図組成物とGがHであるnグラフに点があるかどうかを尋ねられないことを意味。
質問の分析建設、答えは一意ではありません。図画像とエッジの数は、N = 4 * K + 2、および4 * K + 3ときいいえ溶液に、これを補完します
n = 4の場合*部分P1に4点にK、点P2、P3の全て、P4前の2つの群構成、さらに部分と部分との間の2つの2部縁部とP3P1、P4P2の間に接続された2つの側P1P2の2つの部分二十から二さえ側
図その相補体は、元と同形接続側P3P2の間に接続されたエッジ間のグループP3P4、P4P1、から構成されています。
ブロック、絵P1P2P3P4図P3P4P2P1補体または他の方式との間のマッピング。
n = 4の場合* K + 1とも十分にランダムな点の残りの二つのブロック。
コード
// B用 の#include <ビット/ STDC ++ H> 使用して名前空間STDを、 typedefの長い長いLL。 const int型 MAXN = 2E3 + 10 。 INT G [MAXN] [MAXN]。 INT のmain() { int型、T、N、カセ= 1 。 cinを >> トン。 一方、(t-- ){ CIN >> N。 memsetの(G、0、はsizeof (G))。 printf(" ケース#%dの:"、加瀬++ ); もし (N%4 == 2 || N%4 == 3 ){ COUT << " いいえ" << ENDL。 続け; } 他{ COUT << " はい" << ENDL。 INTのブロック= N / 4 。 以下のために(int型 i = 1 ; iは=ブロックを<I ++は{) のための(int型 J =ブロック+ 1、J <= 2 *ブロック; jは++) G [I] [J] = G [j]は[I] = 1 。 用(INT J = 2 *ブロック+ 1、J <= 3 *ブロック; J ++ ) G [I] [J] = G [j]は[I] = 1 。 用(int型 J = I + 1 ; J <=ブロックJ ++ ) G [I] [J] = G [j]は[I] = 1 。 } のための(int型 I =ブロック+ 1 ; I <= 2 *ブロック、iは++ ){ ため(INT J =3 *ブロック+ 1、J <= 4 *ブロック; J ++ ) G [I] [J] = G [j]は[I] = 1 。 用(int型 J = I + 1、J <= 2 ; *ブロックJ ++ ) G [I] [J] = G [j]は[I] = 1 。 } 場合(N%4 == 1 ){ ため(int型 iは= 1 ; I <= 2 *ブロック、iは++ ) Gを[I] [N] = G [n]は[I] = 1 。 以下のために(int型 i = 1 ; iが= <N; iは++ ){ ための(int型 J = 1 ; J <= N; J ++ ) のprintf(" %dの" 、G [I] [J])。 printf(" \ nを" ); } のために(int型 I = 2 *ブロック+ 1 ; I <= 4 *ブロック、iは++ ) のprintf(" %dの" 、I)。 以下のための(int型 I = 2*ブロック; I> = 1 ; i-- ) のprintf(" %dの" 、I)。 printf(" %d個の\ n " 、N)。 } 他{ ため(int型 i = 1 ; iが<= N; iが++ ){ ため(INT J = 1 ; J <= N; J ++ ) のprintf(" %dの" 、G [I] [J])。 printf(" \ nを" ); } のために(int型、I = 2 *ブロック+ 1 ; I <= 4 *ブロック、iは++ ) のprintf(" %dの" 、I)。 以下のために(int型 iは= 2 *ブロックを、I> = 1 ; i-- ) のprintf(" %d個の%Cを"、I、I == 1?' \ N ':' ' )。 } } } }