-
Notifications
You must be signed in to change notification settings - Fork 27
Fix DFS root-revisit bug in isConnected; add Prufer sequence report #81
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,100 @@ | ||
| // GraphTea Project: http://github.com/graphtheorysoftware/GraphTea | ||
| // Copyright (C) 2012 Graph Theory Software Foundation: http://GraphTheorySoftware.com | ||
| // Copyright (C) 2008 Mathematical Science Department of Sharif University of Technology | ||
| // Distributed under the terms of the GNU General Public License (GPL): http://www.gnu.org/licenses/ | ||
|
|
||
| package graphtea.extensions.reports.basicreports; | ||
|
|
||
| import graphtea.graph.graph.GraphModel; | ||
| import graphtea.graph.graph.Vertex; | ||
| import graphtea.platform.lang.CommandAttitude; | ||
| import graphtea.plugins.reports.extension.GraphReportExtension; | ||
|
|
||
|
|
||
| /** | ||
| * Computes the Prüfer sequence of a labeled tree. | ||
| * | ||
| * The Prüfer sequence is a unique sequence of n-2 vertex labels that encodes | ||
| * a labeled tree on n vertices. It is produced by repeatedly removing the leaf | ||
| * with the smallest label and appending its neighbor's label to the sequence. | ||
| * | ||
| * The graph must be an unrooted labeled tree (connected, undirected, n-1 edges). | ||
| */ | ||
| @CommandAttitude(name = "prufer_sequence", abbreviation = "_ps") | ||
| public class PruferSequence implements GraphReportExtension<String> { | ||
|
|
||
| public String calculate(GraphModel g) { | ||
| int n = g.getVerticesCount(); | ||
| if (n < 2) { | ||
| return "Graph must have at least 2 vertices"; | ||
| } | ||
| if (g.getEdgesCount() != n - 1) { | ||
| return "Graph is not a tree (edge count must equal n-1)"; | ||
| } | ||
|
|
||
| // degree[i] mirrors the current degree of vertex with id=i | ||
| int[] degree = new int[n]; | ||
| Vertex[] vertices = g.getVertexArray(); | ||
| for (Vertex v : vertices) { | ||
| degree[v.getId()] = g.getDegree(v); | ||
| } | ||
|
Comment on lines
+21
to
+40
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 3. Directed tree accepted PruferSequence claims the input must be an undirected tree but never rejects directed graphs; on directed graphs it mixes total degree (in+out) with neighbors derived from outgoing edges only, producing incorrect sequences or misleading errors. Agent Prompt
|
||
|
|
||
| int[] sequence = new int[n - 2]; | ||
| boolean[] removed = new boolean[n]; | ||
|
|
||
| for (int step = 0; step < n - 2; step++) { | ||
| // find the leaf with the smallest id | ||
| int leaf = -1; | ||
| for (int i = 0; i < n; i++) { | ||
| if (!removed[i] && degree[i] == 1) { | ||
| leaf = i; | ||
| break; | ||
| } | ||
| } | ||
| if (leaf == -1) { | ||
| return "Graph is not a tree (cycle detected)"; | ||
| } | ||
|
|
||
| // find the unique neighbor of this leaf | ||
| Vertex leafVertex = g.getVertex(leaf); | ||
| int neighbor = -1; | ||
| for (Vertex nb : g.getNeighbors(leafVertex)) { | ||
| if (!removed[nb.getId()]) { | ||
| neighbor = nb.getId(); | ||
| break; | ||
|
Comment on lines
+35
to
+64
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 2. Subgraph id crash PruferSequence indexes arrays by Vertex.getId(), but in GraphModel subgraphs (subgraphIndex!=0) the local vertex index is stored separately as a subgraphId, so getId() can be outside 0..n-1 and cause ArrayIndexOutOfBoundsException or incorrect removals. Agent Prompt
|
||
| } | ||
| } | ||
| if (neighbor == -1) { | ||
| return "Graph is not a tree (disconnected)"; | ||
| } | ||
|
|
||
| sequence[step] = neighbor; | ||
| removed[leaf] = true; | ||
| degree[leaf] = 0; | ||
| degree[neighbor]--; | ||
| } | ||
|
|
||
| // format as comma-separated list of 1-based labels for readability | ||
| StringBuilder sb = new StringBuilder(); | ||
| for (int i = 0; i < sequence.length; i++) { | ||
| sb.append(sequence[i]); | ||
| if (i < sequence.length - 1) { | ||
| sb.append(", "); | ||
| } | ||
| } | ||
| return sb.toString(); | ||
| } | ||
|
|
||
| public String getName() { | ||
| return "Prufer Sequence"; | ||
| } | ||
|
|
||
| public String getDescription() { | ||
| return "Prufer sequence of a labeled tree"; | ||
| } | ||
|
|
||
| @Override | ||
| public String getCategory() { | ||
| return "General"; | ||
| } | ||
| } | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
1. Extra blank line in prufersequence
📘 Rule violation⛯ ReliabilityAgent Prompt
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools