Java 统计图中的所有顶点
我对java相当陌生,两周来我一直在努力做这个练习(这是我学校的家庭作业)。我需要创建一个拓扑排序并打印出所有可能的连接。我现在已经读了很多关于拓扑排序的书,但是我们有一些代码需要处理。我很确定,当我有顶点列表时,我可以进行拓扑排序。我的问题是,我不知道如何列出给定代码中的所有顶点。如果有人能给我一些建议或线索,或者举个例子,我会非常感激 下面是我们需要使用的给定代码:Java 统计图中的所有顶点,java,graph,vertex,edges,Java,Graph,Vertex,Edges,我对java相当陌生,两周来我一直在努力做这个练习(这是我学校的家庭作业)。我需要创建一个拓扑排序并打印出所有可能的连接。我现在已经读了很多关于拓扑排序的书,但是我们有一些代码需要处理。我很确定,当我有顶点列表时,我可以进行拓扑排序。我的问题是,我不知道如何列出给定代码中的所有顶点。如果有人能给我一些建议或线索,或者举个例子,我会非常感激 下面是我们需要使用的给定代码: import java.util.*; public class Answer { public static vo
import java.util.*;
public class Answer {
public static void main (String[] args) {
Answer a = new Answer();
a.run();
}
public void run() {
// TODO!!! YOUR TESTS HERE!
Graph g = new Graph ("G");
Vertex a = new Vertex ("A");
Vertex b = new Vertex ("B");
Vertex c = new Vertex ("C");
g.first = a;
a.next = b;
b.next = c;
Edge ab = new Edge ("AB");
Edge ac = new Edge ("AC");
Edge ba = new Edge ("BA");
Edge ca = new Edge ("CA");
a.first = ab;
b.first = ba;
c.first = ca;
ab.next = ac;
ab.target = b;
ac.target = c;
ba.target = a;
ca.target = a;
System.out.println (g);
}
class Vertex {
String id;
Vertex next;
Edge first;
Vertex (String s, Vertex v, Edge e) {
id = s;
next = v;
first = e;
}
Vertex (String s) {
this (s, null, null);
}
@Override
public String toString() {
return id;
}
// TODO!!! Your Vertex methods here!
} // Vertex
class Edge {
String id;
Vertex target;
Edge next;
Edge (String s, Vertex v, Edge e) {
id = s;
target = v;
next = e;
}
Edge (String s) {
this (s, null, null);
}
@Override
public String toString() {
return id;
}
// TODO!!! Your Edge methods here!
} // Edge
class Graph {
String id;
Vertex first;
Graph (String s, Vertex v) {
id = s;
first = v;
}
Graph (String s) {
this (s, null);
}
@Override
public String toString() {
String nl = System.getProperty ("line.separator");
StringBuffer sb = new StringBuffer (nl);
sb.append (id + nl);
Vertex v = first;
while (v != null) {
sb.append (v.toString() + " --> ");
Edge e = v.first;
while (e != null) {
sb.append (e.toString());
sb.append ("(" + v.toString() + "->"
+ e.target.toString() + ") ");
e = e.next;
}
sb.append (nl);
v = v.next;
}
return sb.toString();
}
// TODO!!! Your Graph methods here!
} // Graph
}
显然,图中有一个对第一个顶点的引用,而顶点本身被链接到一个单独链接的列表中。将顶点收集到Java列表中所需的全部代码如下:
public List<Vertex> allVertices(Graph g) {
final List<Vertex> vertices = new ArrayList<>();
for (Vertex v = g.first; v != null; v = v.next)
vertices.add(v);
return vertices;
}
公共列表所有顶点(图g){
最终列表顶点=新的ArrayList();
对于(顶点v=g.first;v!=null;v=v.next)
添加(v);
返回顶点;
}
显然,图形中有一个对第一个顶点的引用,这些顶点本身被链接到一个单独链接的列表中。将顶点收集到Java列表中所需的全部代码如下:
public List<Vertex> allVertices(Graph g) {
final List<Vertex> vertices = new ArrayList<>();
for (Vertex v = g.first; v != null; v = v.next)
vertices.add(v);
return vertices;
}
公共列表所有顶点(图g){
最终列表顶点=新的ArrayList();
对于(顶点v=g.first;v!=null;v=v.next)
添加(v);
返回顶点;
}
我建议您在设置为零的边上添加一个“lastvisited”整数字段,或者使用布尔值“visited”(真/假)。然后从一个顶点开始。假设图形是连接的,则通过遍历一个顶点的未访问边,然后沿着边到它所指向的顶点,将边标记为跟随,并递归调用此顶点的计数函数,可以到达所有顶点
I.E.: count(node) = sum(my unvisited edges) mark_edge_as_visited(edge), count(edge.target)
请注意,你还必须考虑图是一个有向图,所以从A到B,从B到A的边被计算为两个边。
编辑:我犯了一个错误,您还需要将顶点标记为已访问,否则它将被访问两次(我想到的是无向图)。我建议您在设置为零的边上添加一个“lastvisited”整数字段,或使用布尔“visited”(真/假)。然后从一个顶点开始。假设图形是连接的,则通过遍历一个顶点的未访问边,然后沿着边到它所指向的顶点,将边标记为跟随,并递归调用此顶点的计数函数,可以到达所有顶点
I.E.: count(node) = sum(my unvisited edges) mark_edge_as_visited(edge), count(edge.target)
请注意,你还必须考虑图是一个有向图,所以从A到B,从B到A的边被计算为两个边。
编辑:我犯了一个错误,您还需要将顶点标记为已访问,否则它将被访问两次(我想到的是一个无向图)。提示:其中显示//TODO。。。你需要填写代码来完成你需要做的事情。在run()方法中,您可以调用新函数以获取答案。提示:其中显示//TODO。。。你需要填写代码来完成你需要做的事情。在run()方法中,可以调用新函数来获得答案。