编程启示录:图Graph的可视化方案

图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会帮我们生成一个以结点数量和结点最大度为入参的生成图函数
  • 我们可以根据需要调整 maxNodesmaxDegree 的值来控制生成的图的规模和度数限制
  • 笔者要求使用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:结构化打印图
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值