邻接矩阵(java)中的邻居(int参数)有问题

时间:2014-01-26 09:29:48

标签: java matrix

我需要朝着正确的方向迈出一步。过去几个小时我一直想弄清楚这个。

我已经设置了邻接矩​​阵,但无法弄清楚邻居(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("-----");
    }

}
}

1 个答案:

答案 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;
}