我需要朝着正确的方向迈出一步。过去几个小时我一直想弄清楚这个。
我已经设置了邻接矩阵,但无法弄清楚邻居(int i)方法如何计算有多少相邻顶点入射到顶点i,然后让邻居以整数形式返回那些入射顶点的集合形式。
代码就像
public class Graph {
// Setup privately modified variables which will define the graph
// These two parameters are storage variables for edges and vertices
private int vertex;
private int edge;
// This will be the adjacency matrix to represent out graph, this will represent edges.
private static boolean[][] adj_Matrix_Edges;
// This will be an array to store the vertices.
private int[] adj_Matrix_Vertices;
// first step will be to setup the graph, using this constructor
public Graph() {
// Initialize the scanner for user's input on vertices.
Scanner scan = new Scanner(System.in);
// define local variable for user input.
int num_vertices;
num_vertices = vertex;
// ask for user input
System.out
.println("Please enter how many nodes will be on the graph: ");
num_vertices = scan.nextInt();
// make a runtime exception for nonnegative values.
if (num_vertices < 0) {
throw new RuntimeException(
"Number of vertices cannot be a nonnegative value");}
System.out.println("There are now " + num_vertices + " vertices in the graph.");
// Vertices are stored in a one dimensional array.
adj_Matrix_Vertices = new int[num_vertices];
// A graph is created based on the user's specifications, N X N or (n^2) graph.
adj_Matrix_Edges = new boolean[num_vertices][num_vertices];
}
//This method validates whether or not two vertices are adjacent, returns true if adjacent false otherwise.
public boolean adjacent(int i, int j) {
if (adj_Matrix_Edges[i][j] == true) {
System.out.println("The vertex " + i + " and vertex " + j + " are adjacent.");
return true;}
else{
System.out.println("The vertex " + i + " and vertex " + j + " are not adjacent");
return false;}
}
public void neighbors(int i){
int j = i;
}
// This method adds an edge if the two int values in the 2-d boolean array are false, converts to true otherwise stays true if already an edge present
public void addEdge(int vertex_add_1, int vertex_add_2) {
if (adj_Matrix_Edges[vertex_add_1][vertex_add_2] == false) {
adj_Matrix_Edges[vertex_add_1][vertex_add_2] = true;
adj_Matrix_Edges[vertex_add_2][vertex_add_1] = true;
} else {
System.out.println("There is already an edge between vertex " + vertex_add_1 + " and vertex " + vertex_add_2 + ".");
}
}
// This method removes an edge if the two int values in the 2-d boolean array are true, converts to false, otherwise it stays false if no edge present
public void removeEdge(int vertex_remove_1, int vertex_remove_2) {
if (adj_Matrix_Edges[vertex_remove_1][vertex_remove_2] == true) {
adj_Matrix_Edges[vertex_remove_1][vertex_remove_2] = false;
adj_Matrix_Edges[vertex_remove_1][vertex_remove_2] = false;
} else {
System.out.println("There is no edge between vertex "
+ vertex_remove_1 + " and vertex " + vertex_remove_2);
}
}
public static void main(String[] args) {
Graph graph = new Graph();
graph.addEdge(1, 2);
graph.removeEdge(0, 1);
graph.adjacent(1, 2);
graph.adjacent(2, 1);
for (int i = 0; i < adj_Matrix_Edges.length; i++){
for (int j = 0; j < adj_Matrix_Edges[i].length; j++){
System.out.println(adj_Matrix_Edges[i][j] + " ");
}
System.out.println("-----");
}
}
}
答案 0 :(得分:1)
您必须遍历表示顶点边缘的邻接矩阵中的列。如果要获取相邻顶点的数量,只需将该列中的真值相加即可。如果要获取邻居集合,请在列中返回具有真值的索引
public List<Integer> getNeighbors(int vertex) {
List<Integer> neighbors = new ArrayList<Integer>();
for (int i = 0; i < adj_Matrix_Edges.length; i++){
if(adj_Matrix_Edges[vertex][i]) {
neighbors.add(i);
}
}
return neighbors;
}
编辑:
public int[] getNeighborCount(int vertex) {
int neighborCount = 0;
for (int i = 0; i < adj_Matrix_Edges.length; i++){
if(adj_Matrix_Edges[vertex][i]) {
neighborCount++;
}
}
return neighborCount;
}
public int[] getNeighbors(int vertex) {
int[] neighbors = new int[getNeighborCount()];
int j = 0;
for (int i = 0; i < adj_Matrix_Edges.length; i++){
if(adj_Matrix_Edges[vertex][i]) {
neighbors[j++] = i;
}
}
return neighbors;
}