图Graph的可视化方案
在线可视化网站
面向GPT的Prompt
01 随机生成图
(1) Prompt
以下是图Graph、结点Node和边Edge的类定义
class Node{
int value;
int in; //入度
int out; //出度
ArrayList<Node> nexts; //邻接点
ArrayList<Edge> edges; //出边集
}
class Edge{
int weight;
Node from;
Node to;
}
class Graph{
HashMap<Integer,Node> nodes;
HashSet<Edge> edges;
}
请帮我生成一个随机初始化图的算法,要求结点的权值为不超过100的正整数,
结点的value值为不超过100的正整数,要求图全连通,结点的数量不超过10,边的入度出度均不超过3。
(2) 说明
- 交给GPT的类定义可以不加构造函数,GPT返回代码的时候会贴心地帮我们加上构造函数
- GPT会帮我们生成一个以结点数量和结点最大度为入参的生成图函数
- 我们可以根据需要调整
maxNodes
和maxDegree
的值来控制生成的图的规模和度数限制 - 笔者要求使用java语言实现上述功能时,在根据最大度生成边的部分会产生一个死循环的错误,需要手动修改代码
02 结构化打印图
(1) Prompt
以下是图Graph、结点Node和边Edge的类定义
static class Node {
int value;
int in; // 入度
int out; // 出度
ArrayList<Node> nexts; // 邻接点
ArrayList<Edge> edges; // 出边集
}
static class Edge {
int weight;
Node from;
Node to;
}
static class Graph {
HashMap<Integer, Node> nodes;
HashSet<Edge> edges;
}
请按照以下格式输出图的数据
0
1
2
3
4
5
0 2 2
0 4 3
0 5
1 4
1 5
2 3
2 4
4 5
该数据格式的含义为:
1.首先,逐行打印每个结点的值,每一行只有一个值的时候表示一个新的结点。
2.其次,打印每一条边,每一行表示一条边。
3.当这一行有两个数据时,该行的第一个数据表示源点,第二个数据表示终点。
4.当这一行有三个数据时,该行的第一个数据表示源点,第二个数据表示终点,第三个数据表示权值。
(2) 说明
- 调用函数打印成功后,将控制台的数据复制,粘贴到在线网站的
Graph Data
, - 就可以看到可视化的图结构了
03 自定义图1
java实现,我想要实现类似如下的功能:
Graph graph = new Graph();
Node node0 = new Node(0);
Node node1 = new Node(1);
Node node2 = new Node(2);
Node node3 = new Node(3);
Node node4 = new Node(4);
Node node5 = new Node(5);
graph.nodes.put(0, node0);
graph.nodes.put(1, node1);
graph.nodes.put(2, node2);
graph.nodes.put(3, node3);
graph.nodes.put(4, node4);
graph.nodes.put(5, node5);
Edge edge1 = new Edge(1, node2, node1);
Edge edge2 = new Edge(2, node2, node3);
Edge edge3 = new Edge(3, node3, node1);
Edge edge4 = new Edge(4, node1, node4);
Edge edge5 = new Edge(0, node1, node5);
Edge edge6 = new Edge(0, node2, node3);
Edge edge7 = new Edge(0, node2, node4);
Edge edge8 = new Edge(0, node4, node5);
graph.edges.add(edge1);
graph.edges.add(edge2);
graph.edges.add(edge3);
graph.edges.add(edge4);
graph.edges.add(edge5);
graph.edges.add(edge6);
graph.edges.add(edge7);
graph.edges.add(edge8);
printGraphData(graph);
但是我要求,用户可以在控制台输入结点的值,每次输入完一个结点,用户输入回车,当用户输入”==“表示结点输入完毕,
每次输入一条边,每条边输入比如5 3 2表示存在一条从5指向3的结点,权值为2,每次输入完一条边,用户输入回车,如果输入边的时候输入了没有的结点,控制条提示错误,输入”==“时停止输入边,然后完成整个手动初始化的过程。
04 自定义图2
java实现,我想要实现类似如下的功能:
Graph graph = new Graph();
Node node0 = new Node(0);
Node node1 = new Node(1);
Node node2 = new Node(2);
Node node3 = new Node(3);
Node node4 = new Node(4);
Node node5 = new Node(5);
graph.nodes.put(0, node0);
graph.nodes.put(1, node1);
graph.nodes.put(2, node2);
graph.nodes.put(3, node3);
graph.nodes.put(4, node4);
graph.nodes.put(5, node5);
Edge edge1 = new Edge(1, node2, node1);
Edge edge2 = new Edge(2, node2, node3);
Edge edge3 = new Edge(3, node3, node1);
Edge edge4 = new Edge(4, node1, node4);
Edge edge5 = new Edge(0, node1, node5);
Edge edge6 = new Edge(0, node2, node3);
Edge edge7 = new Edge(0, node2, node4);
Edge edge8 = new Edge(0, node4, node5);
graph.edges.add(edge1);
graph.edges.add(edge2);
graph.edges.add(edge3);
graph.edges.add(edge4);
graph.edges.add(edge5);
graph.edges.add(edge6);
graph.edges.add(edge7);
graph.edges.add(edge8);
printGraphData(graph);
以下是图Graph、结点Node和边Edge的类定义
static class Node {
int value;
int in; // 入度
int out; // 出度
ArrayList<Node> nexts; // 邻接点
ArrayList<Edge> edges; // 出边集
}
static class Edge {
int weight;
Node from;
Node to;
}
static class Graph {
HashMap<Integer, Node> nodes;
HashSet<Edge> edges;
}
用户按照以下格式通过粘贴的方式一次性全部输入图的数据
0
1
2
3
4
5
0 2 2
0 4 3
0 5
1 4
1 5
2 3
2 4
4 5
该数据格式的含义为:
1.首先,逐行打印每个结点的值,每一行只有一个值的时候表示一个新的结点。
2.其次,打印每一条边,每一行表示一条边。
3.当这一行有两个数据时,该行的第一个数据表示源点,第二个数据表示终点。
4.当这一行有三个数据时,该行的第一个数据表示源点,第二个数据表示终点,第三个数据表示权值。
Java代码说明
主函数测试
public static void main(String[] args) {
Graph graph = GraphGenerator.generateRandomGraph(5, 2);
GraphPrinter.printGraphData(graph);
Graph graph2 = GraphGenerator.userDefinedGenerateGraph();
GraphPrinter.printGraphData(graph2);
}
Graph生成器
-
公共类名:GraphGenerator
-
内部方法
- generateRandomGraph:随机生成图
- userDefinedGenerateGraph:控制台交互生成图
- happyGenerateGraph:修改参数定义生成图
修改参数定义生成图
int[] nodesValues = new int[]{0, 1, 2, 4, 5}; //TODO:需要修改
//TODO:需要修改
int[][] edgesArray= {
{0,2,1},
{0,4,3},
{0,5,2},
{1,4,5},
};
- 需要修改两个参数:nodesValues、edgesArray
- nodesValues中的结点没有顺序限制
- edgesArray中内部数组一定是一个大小为
3
的一维数组edgesArray[i][0]
是源点/出发点的值edgesArray[i][1]
是终点/目标点的值edgesArray[i][2]
是边的权重/权值
Graph打印机
- 公共类名:GraphPrinter
- 内部方法
- printGraphData:结构化打印图