当前位置: 首页 > >

【数据结构】图---基本概念

发布时间:

基本概念
图的定义
图是由一些点和这些点之间的连线所组成;其中,点通常被称为“顶点”,而点与点之间的连线则被称为“边或弧”,通常记为:G = (V,E)


图的种类
根据边是否有方向,将图可以划分为:无向图有向图



无向图是一种特殊的有向图,它的每一条边都有两个方向


临接点和度


邻接点
一条边上的两个顶点叫做邻接点。
例如:上图无向图G0中的顶点A和顶点C就是邻接点
在有向图中,除了邻接点之外,还有“入边”和“出边”的概念。
顶点的入边,是指以该顶点为终点的边。而顶点的出边,则是指以该顶点为起点的边。
例如:上面有向图G2中BE是邻接点;是B的出边,还是E的入边。

在无向图中,某个顶点的度是邻接到该顶点的边(或弧)的数目。
例如,上面无向图G0中的顶点A的度是2
在有向图中,度还有“入度”和“出度”之分。
某个顶点的入度,是指以该顶点为终点的边的数目。而顶点的出度,则是指以该顶点为起点的边的数目。
例如:上面有向图G2中,顶点B的入度是2,出度是3;顶点B的度*=2+3=5***


图的存储结构


邻接矩阵
邻接矩阵是指由矩阵来表示图。它是采用矩阵来描述图中顶点之间的关系(及弧或边的权)
假设图中的顶点数为n,则邻接矩阵的定义为:

通常采用两个数组来实现邻接矩阵:一个一维数组用来保存顶点信息,一个二维数组用来保存边的信息。
邻接矩阵的缺点就是比较耗费空间。


邻接表
邻接表是图的一种链式存储表示方法。它是改进后的“邻接矩阵”,它的缺点是不方便判断两个顶点之间是否有边,但是相对邻接矩阵来说更省空间。


邻接矩阵实现无向图


public class MatrixNDG {
int size;//图顶点个数
char[] vertexs;//图顶点名称
int[][] matrix;//图关系矩阵

public MatrixNDG(char[] vertexs, char[][] edges) {
size = vertexs.length;
matrix = new int[size][size];//图关系矩阵大小
this.vertexs = vertexs;
for (char[] c:edges) {//设置矩阵值
int p1 = getPosition(c[0]);//根据顶点名称确定对应矩阵下标
int p2 = getPosition(c[1]);
matrix[p1][p2] = 1;//无向图在两个对称位置存储
matrix[p2][p1] = 1;
}


}
private int getPosition(char ch){
for (int i = 0; i
if (vertexs[i] == ch)
return i;
}
return -1;
}
}

邻接矩阵实现有向图


public class MatrixDG {
int size;
char[] vertexs;
int[][] matrix;
public MatrixDG(char[] vertexs, char[][] edges) {
size = vertexs.length;
matrix = new int[size][size];//图关系矩阵大小
this.vertexs = vertexs;
for (char[] c:edges) {//设置矩阵值
int p1 = getPosition(c[0]);//根据顶点名称确定对应矩阵下标
int p2 = getPosition(c[1]);
matrix[p1][p2] = 1;
}


}
private int getPosition(char ch){
for (int i = 0; i
if (vertexs[i] == ch)
return i;
}
return -1;
}
}

邻接表实现无向图


public class ListNDG {
Vertex[] vertexLists;//邻接表数组
int size;
class Vertex{//邻接表节点类,点链表数据结构
char ch;
Vertex next;

public Vertex(char ch) {
this.ch = ch;
}
void add(char ch){//加到链表尾
Vertex node = this;
while (node.next != null){
node = node.next;
}
node.next = new Vertex(ch);
}
}

public ListNDG(char[] vertexs,char[][] edges) {
size = vertexs.length;
this.vertexLists = new Vertex[size];//确定邻接表大小
for (int i = 0; i < size; i++) {
this.vertexLists[i] = new Vertex(vertexs[i]);
}
//存储边信息
for (char[] c:edges) {
int p1 = getPosition(c[0]);
vertexLists[p1].add(c[1]);
int p2 = getPosition(c[1]);
vertexLists[p2].add(c[0]);
}
}
private int getPosition(char ch){
for (int i = 0; i
if (vertexLists[i].ch == ch)
return i;
}
return -1;
}
}

邻接表实现有向图


public class ListDG {
Vertex[] vertexLists;//邻接表数组
int size;
class Vertex{//邻接表节点类,点链表数据结构
char ch;
Vertex next;

public Vertex(char ch) {
this.ch = ch;
}
void add(char ch){//加到链表尾
Vertex node = this;
while (node.next != null){
node = node.next;
}
node.next = new Vertex(ch);
}
}
public ListDG(char[] vertexs,char[][] edges) {
size = vertexs.length;
this.vertexLists = new Vertex[size];//确定邻接表大小
for (int i = 0; i < size; i++) {
this.vertexLists[i] = new Vertex(vertexs[i]);
}
//存储边信息
for (char[] c:edges) {
int p1 = getPosition(c[0]);
vertexLists[p1].add(c[1]);
}
}
private int getPosition(char ch){
for (int i = 0; i
if (vertexLists[i].ch == ch)
return i;
}
return -1;
}
}

原文:https://gper.club/articles/7e7e7f7ff7g5bgc6g6c



友情链接: