图的表示方式可以有很多种,我们在平常使用的时候最常使用的有两种,一个是邻接矩阵法,另一个是邻接表法,下面着重介绍这两个方法。
邻接矩阵法
邻接矩阵法是采用一个N*N的矩阵G来存储图中边的情况,其中N的数目为图中结点的数目。
具体的标记方法是若图中结点i和结点j之间有边则G[i][j]的值为1,否则为0,通过这种方法我们可以发现当我们存储无向图的时候,邻接矩阵是一个对称矩阵,我们可以压缩为一维矩阵来存储,依次来节省存储空间,元素对应关系为i*(i+1)/2+j;
搜索时的代码主要如下所示:
//深度优先搜索方式
Class A{
int [][]G; //邻接矩阵
int []visited; //访问标记数组
public void fun(){
for(int i=0;i<G.length;i++){
if(visited[i]==0)
dfs(i);
}
}
private void dfs(int i){
for(int j=0;j<G.length;j++){
if(G[i][j]==1&&visited[j]==0)
{
visited[j]=1;
dfs(j);
}
}
}
}
//广度优先搜索方式
Class A{
int [][]G;
int []visited;
public void BFS(){
Queue<Integer> q=new Queue<>();
for(int i=0;i<G.length;i++){
if(visited[i]==0){
q.offer(i);
visited[i]=1;
}
while(!q.isEmpty()){
int x=q.poll();
for(int j=0;j<G.length;j++){
if(G[i][j]==1&&visited[j]==0)
q.offer(j);
}
}
}
}
邻接表法
当图比较稀疏的时候,采用邻接矩阵方式就会造成空间的浪费,这时候可以采用邻接表的方法来表示。
可以这样形象化的理解,一共有N行(N表示结点个数),每一行存储的为与该结点相邻的所有结点,也就是和该结点之间右边的结点。
具体的代码如下:
//在java中可以采用List<List<Integer>>这种数据结构来表示邻接表;
Class A{
List<List<Integer>> edges;
int []visited;
public void fun(){
for(int i=0;i<n;i++)
{
if(visited[i]==0;
dfs(i);
}
}
private void dfs(int i){
visited[i]=1;
for(int x:edges.get(i))
{
if(visited[x]==0)
{
dfs(x);
}
}
}
}