【数据结构】图形的多种表示方法及其java实现之相邻矩阵法
2016-05-16 15:58
519 查看
图形是由多个定点以及连接定点的边构成的集合。通常用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表示没有。如上左右两图形可用相邻矩阵法分别表示如下:
生成相邻矩阵的代码如下:
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]
左图为无向图形,表示为: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]
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树