隣接行列のコーディング方法

隣接行列のコーディング方法

これをLaTeXでコーディングする方法を知っていますか? ここに画像の説明を入力してください

答え1

を使えばnicematrix、とても簡単です

ここに画像の説明を入力してください

\documentclass{article}
\usepackage{nicematrix}

\begin{document}

\[
\mathbf{A}_H = 
\begin{bNiceMatrix}[first-row,first-col]
    & v_6 & v_3 & v_4 & v_5 & v_1 & v_2 \\
v_6 & 0   & 1   & 0   & 1   & 0   & 0   \\
v_3 & 1   & 0   & 1   & 0   & 0   & 1   \\
v_4 & 0   & 1   & 0   & 1   & 0   & 0   \\
v_5 & 1   & 0   & 1   & 0   & 1   & 0   \\
v_1 & 0   & 0   & 0   & 1   & 0   & 1   \\
v_2 & 0   & 1   & 0   & 0   & 1   & 0   \\
\end{bNiceMatrix}
\]

\end{document}

答え2

これは興味深い問題です。ここでは、隣接行列を印刷するためのグラフのデータ構造を定義しますが、他の用途も考えられます。

アイデアとしては、頂点のインデックスをシーケンスに格納し、エッジのリストを別のシーケンスに格納するというものです。

頂点リストは、指定されたエッジがエッジ リスト内にあるかどうかを確認するために (2 回) マッピングされます。この場合は1が行列の本体に追加され、それ以外の場合は が追加されます0

を使用するとnicematrix、外側の行と列も埋めることができます。

\documentclass{article}
\usepackage{nicematrix}

\ExplSyntaxOn

\NewDocumentCommand{\definegraph}{mmm}
 {% #1 = graph name, #2 = vertex list, #3 = edge list
  \ryl_graph_define:nnn { #1 } { #2 } { #3 }
 }

\NewDocumentCommand{\adjacencymatrix}{m}
 {% #1 = graph name
  \ryl_graph_adjacency:n { #1 }
 }

\cs_new_protected:Nn \ryl_graph_define:nnn
 {
  \seq_clear_new:c { l__graph_vertex_#1_seq }
  \seq_set_from_clist:cn { l__graph_vertex_#1_seq } { #2 }
  \seq_clear_new:c { l__graph_edge_#1_seq }
  \seq_set_from_clist:cn { l__graph_edge_#1_seq } { #3 }
 }

\tl_new:N \l__ryl_graph_adjacency_tl

\cs_new_protected:Nn \ryl_graph_adjacency:n
 {
  \tl_clear:N \l__ryl_graph_adjacency_tl
  \seq_map_inline:cn { l__graph_vertex_#1_seq }
   {
    \tl_put_right:Nn \l__ryl_graph_adjacency_tl { & v\sb{##1} }
   }
  \tl_put_right:Nn \l__ryl_graph_adjacency_tl { \\ }
  \seq_map_inline:cn { l__graph_vertex_#1_seq }
   {
    \tl_put_right:Nn \l__ryl_graph_adjacency_tl { v\sb{##1} }
    \seq_map_inline:cn { l__graph_vertex_#1_seq }
     {
      \seq_if_in:cnTF { l__graph_edge_#1_seq } { ##1-####1 }
       {% the edge is in
        \tl_put_right:Nn \l__ryl_graph_adjacency_tl { & 1 }
       }
       {
        \seq_if_in:cnTF { l__graph_edge_#1_seq } { ####1-##1 }
         {% the edge is in
          \tl_put_right:Nn \l__ryl_graph_adjacency_tl { & 1 }
         }
         {
          \tl_put_right:Nn \l__ryl_graph_adjacency_tl { & 0 }
         }
       }
     }
    \tl_put_right:Nn \l__ryl_graph_adjacency_tl { \\ }
   }
  \begin{bNiceMatrix}[first-row,first-col]
  \tl_use:N \l__ryl_graph_adjacency_tl
  \end{bNiceMatrix}
 }

\ExplSyntaxOff

\definegraph{A}{1,2,3}{1-2,1-3,2-3}
\definegraph{B}{6,3,4,5,1,2}{6-3,6-5,3-6,3-4,3-2,4-3,4-5,5-1,1-2}

\begin{document}


\[
\adjacencymatrix{A}
\]

\[
\mathbf{A}_{H}=\adjacencymatrix{B}
\]

\end{document}

2 番目の例では、重複するエッジをリストすることは無関係であることがわかります。

ここに画像の説明を入力してください

関連情報