图代码实现

本文介绍了三种图的存储结构:无向不带权图、无向带权图和有向带权图的邻接矩阵实现,以及无向图的邻接表存储方式。邻接矩阵通过二维数组表示节点之间的连接,邻接表则使用一维数组加链表的方式存储节点的邻接关系。这些数据结构在图算法中扮演重要角色。

方式一:邻阶矩阵实现

开辟一个二维数组 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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值