图形是由多个定点以及连接定点的边构成的集合。通常用G=(V,E)表示,其中V为所有顶点的集合,E为所有边的集合。图形可分为无向图形和有向图形,如:
左图为无向图形,表示为:V={A,B,C,D,E};E={(A,B),(A,D),(A,E),(B,C),(B,D),(C,D),(C,E)}。右图为有向图形,表示为:V={A,B,C,D,E};E={<A,B>,<A,E>,<B,D>,<C,D>,<C,B>,<D,A>,<E,C>}。
图形的表示方法有四种:相邻矩阵法,相邻表法,相邻多元列表法以及索引表格法。
相邻矩阵法:用一个n*n的二维矩阵来记录各节点之间的关系,其中n为节点的数量,1表示对应两个节点之间有连接,0表示没有。如上左右两图形可用相邻矩阵法分别表示如下:
A | B | C | D | E | |
A | 0 | 1 | 0 | 1 | 1 |
B | 1 | 0 | 1 | 1 | 0 |
C | 0 | 1 | 0 | 1 | 1 |
D | 1 | 1 | 1 | 0 | 0 |
E | 1 | 0 | 1 | 0 | 0 |
A | B | C | D | E | |
A | 0 | 1 | 0 | 0 | 1 |
B | 0 | 0 | 0 | 1 | 0 |
C | 0 | 1 | 0 | 1 | 0 |
D | 1 | 0 | 0 | 0 | 0 |
E | 0 | 0 | 1 | 0 | 0 |
生成相邻矩阵的代码如下:
package javaTest;
public class GraphExpress {
public static void main(String args[]){
int[][] data1 = {
{1,2},{2,1},{1,4},{4,1},
{1,5},{5,1},{2,3},{3,2},
{2,4},{4,2},{3,4},{4,3},
{3,5},{5,3}
};
int[][] data2 = {
{1,2},{1,5},{2,4},{3,2},
{3,4},{4,1},{5,3}
};
System.out.println("无向图的相邻矩阵:");
adjacentMatrix(data1);
System.out.println("有向图的相邻矩阵:");
adjacentMatrix(data2);
}
public static void adjacentMatrix(int[][] data){
int maxData = 0;
for(int i=0; i<data.length; i++){//确定相邻矩阵的尺寸
for(int j=0; j<data[i].length; j++){
if(data[i][j]>maxData) maxData = data[i][j];
}
}
int[][] matrix = new int[maxData+1][maxData+1];//根据输入数据data完善相邻矩阵
for(int i=0; i<data.length; i++){
matrix[data[i][0]][data[i][1]] = 1;
}
for(int i=1; i<matrix.length; i++){//输出相邻矩阵
for(int j=1; j<matrix[i].length; j++){
System.out.print("["+matrix[i][j]+"] ");
}
System.out.println();
}
}
}
输出:
无向图的相邻矩阵:
[0] [1] [0] [1] [1]
[1] [0] [1] [1] [0]
[0] [1] [0] [1] [1]
[1] [1] [1] [0] [0]
[1] [0] [1] [0] [0]
有向图的相邻矩阵:
[0] [1] [0] [0] [1]
[0] [0] [0] [1] [0]
[0] [1] [0] [1] [0]
[1] [0] [0] [0] [0]
[0] [0] [1] [0] [0]