邻接矩阵的特点:
1、对于有n个顶点的无向图最多需要n(n-1)/2个存储空间,有向图最多需要n^2个存储空间
2、对于无向图,邻接矩阵第i行元素之和是图第i个顶点的度
3、邻接矩阵适用于稠密图
4、方便搜索两顶点是否有边或弧
邻接矩阵的属性
public static final int INF = 32768; // 无穷大
public static final int MAX_VERTEX_NUM = 20; // 最大顶点数
public static int VEXNUM; // 顶点的个数
public static int ARCNUM; // 边的个数
public static int[][] arcs; // 边集合
public static String[] vexs; // 顶点集合
创造一个有向图
public void CreateMatrix(){ // 创建一个有向图
Scanner sc = new Scanner(System.in);
System.out.print("请输入顶点的个数:");
VEXNUM = sc.nextInt(); // 输入顶点的个数
System.out.print("请输入边的个数:");
ARCNUM = sc.nextInt(); // 输入边的个数
// 初始化顶点集合
System.out.println("请输入顶点:");
vexs = new String[VEXNUM];
for (int i=0; i < VEXNUM; i++){
vexs[i] = sc.next();
}
// 初始化邻接矩阵
for (int i = 0; i < VEXNUM; i++) {
arcs = new int[VEXNUM][VEXNUM];
}
for (int i = 0; i < VEXNUM; i++) {
for (int j = 0; j < VEXNUM; j++) {
arcs[i][j] = INF;
}
}
// 输入邻接矩阵
for (int i = 0; i < ARCNUM; i++) {
// 输入边(v1,v2)
System.out.print("请输入(v1,v2):");
String v1 = sc.next();
String v2 = sc.next();
// v1和v2在matrix的位置
int x1 = Locate(v1);
int x2 = Locate(v2);
// 输入权值
System.out.printf("请输入(%s, %s)的权值:", v1, v2);
int weight = sc.nextInt();
arcs[x1][x2] = weight;
}
}
定位v0的位置
public int Locate(String v0){ // 取v0在arcs[][]的位置
for (int i = 0; i < vexs.length; i++) {
if (v0.equals(vexs[i]))
return i;
}
return -1;
}