简介

如题,是一个可以便捷生成图论中各种图的工具。

下载 & 安装

链接

自己选适合自己操作系统的版本。

安装以 Windows 为例,其实也没什么要注意的点,把 “Add Graphviz to the system PATH” 中的任意一个勾上就行了。

命令行试试 dot -V,如果有输出说明安装成功,没输出检查一下勾没勾上上述选项。

配置

以 VSCode 为例。

插件搜索 Graphviz,安装 Graphviz Interactive Preview 和 Graphviz (dot) language support for V。

前者是用于实时生成预览图,后者提供语法高亮。

教程

Graphviz 源文件的扩展名是 .dot。所以我们在 VSCode 中新建一个 .dot 文件。你会发现右上角有一个小图标,点开它,就有了预览界面。

先试着写一点简单的图:

1
2
3
digraph {
A -> B
}

其中,digraph 定义了一个有向图,这个有向图里有 AB 两个结点,其中 AB 连了一条有向边。

1
2
3
4
5
digraph {
A [color = red, shape = box, style = dashed]
B [color = blue, shape = ellipse, style = bold]
A -> B [label = "A to B", color = red, style = dashed]
}

我们来一一解读一下。
第一行我们定义了一个有向图,这和上个示例一样。
第二行我们定义了一个结点 A,它有一些属性,如:红色,方形,虚线。
第三行我们定义了一个结点 B,它有一些属性,如:蓝色,椭圆形,加粗线。
第四行我们定义了一个有向边 A -> B,它的附加文本是 A to B,其他同上。

详细的介绍可以参照官方文档

根据以上内容,我们可以轻松地写出来一个通过一些字符串来构建可视化 Trie 树的程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <bits/stdc++.h>
using namespace std;
const int N=2e5+10;
char s[N];
struct node{
int e[26];
int s;
}t[N];
int n,tot=0;
void insert(char *s){
int p=0;
for(int i=0;s[i];i++){
int c=s[i]-'a';
if(!t[p].e[c])t[p].e[c]=++tot;
p=t[p].e[c];
}
t[p].s++;
}
void dfs(int p){
for(int i=0;i<26;i++){
if(t[p].e[i]){
cout<<p<<" -> "<<t[p].e[i]<<" [label = \""<<(char)('a'+i)<<"\"]"<<'\n';
dfs(t[p].e[i]);
}
}
}
signed main(){
// freopen("in.txt","r",stdin);
// freopen("out.dot","w",stdout);
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++){
cin>>s;
insert(s);
}
cout<<"digraph{"<<'\n';
dfs(0);
for(int i=0;i<=tot;i++)
if(t[i].s)
cout<<i<<" [style = bold]"<<'\n';
cout<<"}"<<'\n';
return 0;
}

对于输出的文件,我们可以通过 dot -Tpng 1.dot -o 1.png 来把 .dot 文件转化成 .png 图片。