二分图

二分图

我想在 latex 中绘制类似的东西。我该怎么做?我希望它是一个有向图,并且能够标记顶点。

二分图

答案1

一种选择是使用PGF/TikZ;该软件包的文档非常完善,您可以在文档中找到许多示例。另一个示例来源可以在TeXample.net

以下是一个小例子:

\documentclass{book}
\usepackage{tikz}
\usetikzlibrary{positioning,chains,fit,shapes,calc}

\begin{document}

\definecolor{myblue}{RGB}{80,80,160}
\definecolor{mygreen}{RGB}{80,160,80}

\begin{tikzpicture}[thick,
  every node/.style={draw,circle},
  fsnode/.style={fill=myblue},
  ssnode/.style={fill=mygreen},
  every fit/.style={ellipse,draw,inner sep=-2pt,text width=2cm},
  ->,shorten >= 3pt,shorten <= 3pt
]

% the vertices of U
\begin{scope}[start chain=going below,node distance=7mm]
\foreach \i in {1,2,...,5}
  \node[fsnode,on chain] (f\i) [label=left: \i] {};
\end{scope}

% the vertices of V
\begin{scope}[xshift=4cm,yshift=-0.5cm,start chain=going below,node distance=7mm]
\foreach \i in {6,7,...,9}
  \node[ssnode,on chain] (s\i) [label=right: \i] {};
\end{scope}

% the set U
\node [myblue,fit=(f1) (f5),label=above:$U$] {};
% the set V
\node [mygreen,fit=(s6) (s9),label=above:$V$] {};

% the edges
\draw (f1) -- (s6);
\draw (s6) -- (f2);
\draw (f2) -- (s7);
\draw (s7) -- (f3);
\draw (s8) -- (f3);
\draw (f3) -- (s9);
\draw (s9) -- (f5);
\draw (f5) -- (s6);
\end{tikzpicture}

\end{document}

编辑:我添加了上一个图的变体(在评论中请求);每个顶点现在将是一个带标签的有序对。这个想法是在每个\foreach构造中使用多个变量;第一个变量将用于为每个节点添加名称并创建标签;第二个和第三个变量将给出每个有序对的第一个和第二个坐标。代码:

\documentclass{book}
\usepackage{tikz}
\usetikzlibrary{positioning,chains,fit,shapes,calc}

\begin{document}

\definecolor{myblue}{RGB}{80,80,160}
\definecolor{mygreen}{RGB}{80,160,80}

\begin{tikzpicture}[thick,
  fsnode/.style={},
  ssnode/.style={},
  every fit/.style={ellipse,draw,inner sep=5pt,text width=2cm},
  ->,shorten >= 3pt,shorten <= 3pt
]

% the vertices of U
\begin{scope}[start chain=going below,node distance=7mm]
\foreach \i/\xcoord/\ycoord in {1/6/8,2/5/1,3/-4/7,4/6/9,5/0/-3}
  \node[fsnode,on chain,label=left:$t_{\i}$] (f\i) {$(\xcoord,\ycoord)$};
\end{scope}

% the vertices of V
\begin{scope}[xshift=4cm,yshift=-0.5cm,start chain=going below,node distance=7mm]
\foreach \i/\xcoord/\ycoord in {6/0/3,7/1/4,8/-2/1,9/5/9}
  \node[ssnode,on chain,label=right:$t_{\i}$] (s\i) {$(\xcoord,\ycoord)$};
\end{scope}

% the set U
\node [myblue,fit=(f1) (f5),label=above:$U$] {};
% the set V
\node [mygreen,fit=(s6) (s9),label=above:$V$] {};

% the edges
\draw (f1) -- (s6);
\draw (s6) -- (f2);
\draw (f2) -- (s7);
\draw (s7) -- (f3);
\draw (s8) -- (f3);
\draw (f3) -- (s9);
\draw (s9) -- (f5);
\draw (f5) -- (s6);
\end{tikzpicture}

\end{document}

答案2

战斗结束后我来到这里,希望能提供一些有趣的信息。

  1. cvs 版本中有一个新的库graphs,但我认为文档中有一个错误,您需要将其替换为:\usetikzlibrary{graph}如果 \usetikzlibrary{ graphs, graphs.standard}不替换,graphs.standard我会收到错误:$缺失

    像您的代码这样的示例(我没有得到这两个集合的蓝色和绿色)

    \documentclass[]{scrartcl}
    \usepackage[usenames,dvipsnames]{xcolor}
    \usepackage{tikz}
    \thispagestyle{empty}
    \usetikzlibrary{
      graphs,
      graphs.standard
    }
    
    \begin{document}
    \definecolor{myblue}{RGB}{80,80,160}
    \definecolor{mygreen}{RGB}{80,160,80}
    
    \begin{tikzpicture}
       \graph[nodes={draw, circle,fill=myblue}, radius=.5cm,
               empty nodes, branch down=1 cm,
               grow right sep=4cm] {subgraph I_nm [V={a, b, c, d, e}, W={1,...,4}];
      a -- { 1};
      b -- { 1, 2 };
      c -- { 2,3, 4 };
      e -- { 1,4}
    };
    \end{tikzpicture}
    
    \end{document}
    

    结果:

    图表来自 tikz

  2. 我制作了一个包tkz-berge,我认为下周它会出现在 ctan 服务器上。我需要完成一些文档工具

    \documentclass[]{scrartcl}
    \usepackage[usenames,dvipsnames]{xcolor}
    \usepackage{tkz-berge}
    \thispagestyle{empty}
    \usetikzlibrary{fit,shapes}
    
    \begin{document}
    
    \definecolor{myblue}{RGB}{80,80,160}
    \definecolor{mygreen}{RGB}{80,160,80}
    
    \begin{tikzpicture}[every fit/.style={ellipse,draw,inner sep=-2pt,text width=2cm, line width=1pt}]
    \GraphInit[vstyle=Normal]
          \SetUpVertex[Math,Lpos=-180,LabelOut]
         \SetVertexNormal[FillColor=myblue,OuterSep=0pt,TextColor=myblue]
         \grEmptyPath[form=2,x=0,y=0,RA=2,rotation=90,prefix=U]{5}
         \SetVertexShade[BallColor=mygreen,OuterSep=0pt]
         \SetUpVertex[Lpos=0]
         \SetVertexNormal[FillColor=mygreen,TextColor=mygreen]
         \grEmptyPath[form=2,x=6,y=0,RA=2,rotation=90,prefix=V]{4}
         \SetUpEdge[lw=2pt,color=black]
        \Edges(U4,V3,U3,V2,U1)
        \Edges(U3,V3,U0,V0,U2,V1)
     % the set U
    \node [myblue,fit=(U0) (U4),label=above:\textcolor{myblue}{$U$}] {};
    % the set V
    \node [mygreen,fit=(V0) (V3),label=above:\textcolor{mygreen}{$V$}] {};
    \end{tikzpicture}
    
    \end{document}
    

    结果不错,但最好在绘制边缘之前在背景中绘制椭圆

    在此处输入图片描述

答案3

这是一个使用pstricks

\documentclass{article}
\usepackage{pst-node}% http://ctan.org/pkg/pst-node
\usepackage{multido}% http://ctan.org/pkg/multido
\begin{document}
\begin{pspicture}

  % Define nodes/vertices
  \multido{\i=5+-1}{5}{\pnode(1,\i){U\i}}% Vertices in U
  \multido{\i=4+-1}{4}{\pnode[0,0.5](4,\i){V\i}}% Vertices in V

  % Draw vertex set/ellipses
  \psset{linestyle=solid,linecolor=black,linewidth=1pt,fillstyle=none}%
  \psellipse[linecolor=blue!80!white](1,3)(1.25,3)% U
  \psellipse[linecolor=green!40!black](4,3)(1.25,2.5)% V
  % Vertex set/ellipse labels
  \rput[u](1,6.5){$U$}% U
  \rput[u](4,6){$V$}% V

  % Node/vertex connections/edges
  \psset{linecolor=black,linewidth=0.5pt}%
  \psline(U5)(V4)
  \psline(U4)(V4) \psline(U4)(V3)%
  \psline(U3)(V2) \psline(U3)(V1)%
  \psline(U2)(V3)%
  \psline(U1)(V4) \psline(U1)(V1)%
  
  % Draw nodes/vertices and labels
  \psset{fillstyle=solid}%
  \multido{\i=5+-1}{5}{% U vertex set
    \pscircle[fillcolor=blue!80!white](U\i){0.2}% Print vertex
    \uput{10pt}[l](U\i){$U_\i$}% Print vertex label
  }%
  \multido{\i=4+-1}{4}{% V vertex set
    \pscircle[fillcolor=green!40!black](V\i){0.2}% Print vertex
    \uput{10pt}[r](V\i){$V_\i$}% Print vertex label
  }%
  \end{pspicture}
\end{document}

使用 pstricks 的二分图

答案4

还有一个可能的解决方案:

\documentclass[tikz, margin=3mm]{standalone}
\usetikzlibrary{calc, chains,
                fit,
                positioning,
                shapes}

\definecolor{myblue}{RGB}{80,80,160}
\definecolor{mygreen}{RGB}{80,160,80}

\begin{document}
    \begin{tikzpicture}[
    node distance = 7mm and 21mm,
      start chain = going below,
         V/.style = {circle, draw, 
                     fill=#1, 
                     inner sep=0pt, minimum size=3mm,
                     node contents={}},
 every fit/.style = {ellipse, draw=#1, inner ysep=-1mm, 
                     inner xsep=5mm},
                    ]
% vertices 
\foreach \i in {4,...,0} 
{
\ifnum\i=4
    \node (n1\i) [V=myblue,on chain,
                  label={[text=myblue]left:$u_{\i}$}];
\else
    \node (n1\i) [V=myblue,on chain,
                  label={[text=myblue]left:$u_{\i}$}];
    \node (n2\i) [V=mygreen, above right=3.5mm and 22mm of n1\i,
                  label={[text=mygreen]right:$v_{\i}$}];
\fi
}
% set U
\node [myblue,fit=(n14) (n10),label=above:$U$] {};
% set V
\node [mygreen,fit=(n23) (n20),label=above:$V$] {};
% links
\draw[->, shorten >=1mm, shorten <=1mm]
        (n14) edge (n23)
        (n13) edge (n23)   (n13) edge (n22)
        (n12) edge (n21)   (n12) edge (n20)
        (n11) edge (n22)
        (n10) edge (n23)   (n10) edge (n20);

    \end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容