方式一:邻阶矩阵实现
开辟一个二维数组 arr[n][n],第一个代表当前顶点,第二个代表所连的其他顶点
①无向不带权图
//该图为无向不带权图
public class Graph {
private int v;//矩阵的行列长
private boolean arr[][];//二维数组,如果为false代表与别的结点没有度
public Graph(int v,boolean[][] arr){
this.v=v;
for(int i=0;i<v;i++){
for(int j=0;j<v;j++){
arr[i][j]=false;//初始化数组默认为0
}
}
}
public void add(int s,int t){//如果两个结点之间有度,则修改他们所在的位置为true
arr[s][t]=true;
arr[t][s]=true;
}
}
②带权无向图
//该图为无向带权图
public class Graph {
private int v;//矩阵的行列长
private int arr[][];//二维数组,如果为0代表与别的结点没有度
public Graph(int v,int[][] arr){
this.v=v;
for(int i=0;i<v;i++){
for(int j=0;j<v;j++){
arr[i][j]=0;//初始化数组默认为0
}
}
}
public void add(int s,int t,int value){//value为权值,如果两个结点之间有度,则修改他们所在的位置为权值
arr[s][t]=value;
arr[t][s]=value;
}
}
③有向带权图
//该图为有向带权图
public class Graph {
private int v;//矩阵的行列长
private int arr[][];//二维数组,如果为0代表与别的结点没有度
public Graph(int v,int[][] arr){
this.v=v;
for(int i=0;i<v;i++){
for(int j=0;j<v;j++){
arr[i][j]=0;//初始化数组默认为0
}
}
}
public void add(int s,int t,int value){//value为权值,s的出度是他t,即s指向t,则修改他们所在的位置为权值
arr[s][t]=value;
}
}
方式二:邻接表存储方式
开辟一个一维数组,一维数组的每个元素后结着一个链表存储它所连顶点
//该图为无向图
public class Graph {
private int v;//数组长度
private LinkedList<Integer> arr[];
public Graph(int v){
this.v=v;
arr=new LinkedList[v];
for(int i=0;i<v;i++){
arr[i]=new LinkedList<>();//将数组中每个元素化为链表,存储它指向的结点
}
}
public void ADD(int s,int t){//因为是无向图,所以存储两次
arr[s].add(t);
arr[t].add(s);
}
}
详见《数据结构与算法之美》P216
本文介绍了三种图的存储结构:无向不带权图、无向带权图和有向带权图的邻接矩阵实现,以及无向图的邻接表存储方式。邻接矩阵通过二维数组表示节点之间的连接,邻接表则使用一维数组加链表的方式存储节点的邻接关系。这些数据结构在图算法中扮演重要角色。

被折叠的 条评论
为什么被折叠?



