图之邻接多重表

邻接多重表是无向图的一种链式存储结构;
边结点:对应无向图中的边,其结点结构如下:

markivexilinkjvexjlinkinfo

其中,mark为标志域,用于标记该条边是否被搜索过;ivex和jvex为该边依附的两个顶点在图中的位置;ilink指向下一条依附于顶点ivex的边;jlink指向下一条依附于顶点jvex的边;info指示和当前边相关的信息 ,如权重等;

头结点:对应于无向图中的顶点,其结点结构如下:

datafirstedge

其中,data域存储和该顶点相关的信息;firstedge域指示第一条依附于该顶点的边;

优点:克服了邻接表中关于对两个结点操作不方便的缺点;

下面给出邻接多重表的Java实现:

package org.sky.graph;

import java.util.Scanner;

/**
 * @description 利用邻接多重表构建无向图
 * @author sky
 * @date 2016/12/30
 */
public class AdjacencyMultilistGragh {

    @SuppressWarnings("unused")
    private static class EdgeBox{
        boolean mark;           //标志域,标记边是否被搜索过
        int iVex, jVex;         //顶点域,指示边的两个顶点的位置
        EdgeBox iLink;          //边域,指示依附于顶点iVex的下一条边
        EdgeBox jLInk;          //边域,指示依附于顶点jVex的下一条边
        int value;              //边的信息,如权重

        public EdgeBox(boolean mark, int iVex, int jVex, EdgeBox iLink,
                EdgeBox jLInk, int value) {
            super();
            this.mark = mark;
            this.iVex = iVex;
            this.jVex = jVex;
            this.iLink = iLink;
            this.jLInk = jLInk;
            this.value = value;
        }

        public boolean isMark() {
            return mark;
        }

        public void setMark(boolean mark) {
            this.mark = mark;
        }

        public int getiVex() {
            return iVex;
        }

        public void setiVex(int iVex) {
            this.iVex = iVex;
        }

        public int getjVex() {
            return jVex;
        }

        public void setjVex(int jVex) {
            this.jVex = jVex;
        }

        public EdgeBox getiLink() {
            return iLink;
        }

        public void setiLink(EdgeBox iLink) {
            this.iLink = iLink;
        }

        public EdgeBox getjLInk() {
            return jLInk;
        }

        public void setjLInk(EdgeBox jLInk) {
            this.jLInk = jLInk;
        }

        public int getValue() {
            return value;
        }

        public void setValue(int value) {
            this.value = value;
        }
    }

    @SuppressWarnings("unused")
    private static class VexBox{
        Object data;            //顶点信息
        EdgeBox firstEdge;      //指向第一条依附于该顶点的边

        public VexBox(Object data, EdgeBox firstEdge) {
            super();
            this.data = data;
            this.firstEdge = firstEdge;
        }
        public Object getData() {
            return data;
        }
        public void setData(Object data) {
            this.data = data;
        }
        public EdgeBox getFirstEdge() {
            return firstEdge;
        }
        public void setFirstEdge(EdgeBox firstEdge) {
            this.firstEdge = firstEdge;
        }
    }

    private int numVex;         //图的当前顶点数
    private int numEdge;            //图的当前弧数

    private VexBox[] adjMulist; //存储表头结点,通常采用顺序存储结构

    public AdjacencyMultilistGragh(int numVex, int numEdge, VexBox[] adjMulist) {
        super();
        this.numVex = numVex;
        this.numEdge = numEdge;
        this.adjMulist = adjMulist;
    }

    /**
     * @Desciption 采用邻接多重表存储表示,构造有向图
     */
    public void createUDG(){
        @SuppressWarnings("resource")
        Scanner sc = new Scanner(System.in);
        System.out.println("请分别输入图的顶点数及边数");
        numVex = sc.nextInt();
        numEdge = sc.nextInt();
        adjMulist = new VexBox[numVex];
        System.out.println("请分别输入图的各个顶点:");
        for(int i = 0; i < numVex; i++){
            adjMulist[i] = new VexBox(sc.next(), null);
        }
        System.out.println("请输入各个边的起始顶点及其权值value");
        for(int k = 0; k < numEdge; k++){
            int i = locateVex(sc.next());   //输入一条弧的始点,即弧尾
            int j = locateVex(sc.next());   //输入一条弧的终点,即弧头
            int value = sc.nextInt();       //输入弧的权重
            EdgeBox p = new EdgeBox(false, i, j, adjMulist[i].firstEdge, adjMulist[j].firstEdge, value);
            adjMulist[i].firstEdge = p;
            adjMulist[j].firstEdge = p;
        }
    }

    /**
     * @Desciption 返回与传入值相对应的定点位置
     */ 
    public int locateVex(Object vex){
        for(int v = 0; v < numVex; v++){
            if(adjMulist[v].getData().equals(vex)){
                return v;
            }
        }
        return -1;
    }       
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对任意给定的(顶点数不小于20,边数不少于30,的类型可以是有向、无向、有向网、无向网),能够输入的顶点和边(或弧)的信息,并存储到相应存储结构(邻接矩阵、邻接表、十字链表、邻接多重表,任选其中两种类型),对自己所创建的完成以下操作: 对无向求每个顶点的度,或对有向求每个顶点的入度和出度(5分) 完成插入顶点和边(或弧)的功能(5分) 完成删除顶点和边(或弧)的功能(5分) 两种存储结构的转换(5分),如果其中一种存储结构为十字链表或邻接多重表则增加5分。 输出的深度优先遍历序列或广度优先遍历序列(5分) 求的深度优先或广度优先的生成树(或生成森林)(存储结构为孩子-兄弟链表),并对生成树进行遍历(15分) 判断的连通性,输出连通分量的个数(5分) 判断中是否存在环,无向5分,有向10分 给出顶点u和v,判断u到v是否存在路径(5分) 10、求顶点u到v的一条简单路径(10分) 11、求顶点u到v的所有简单路径(15分) 12、求顶点u到v的最短路径(10分) 13、求顶点u到其余各顶点的最短路径(15分) 14、求任两个顶点之间的最短路径(15分) 15、求最小生成树(15分) 16、对于有一个源点和一个汇点的有向网,求关键路径(20分) 编程环境可以是C、VC++、JAVA,每位同学从上述题目中选择100分的题目,注意,必须选择第1-6题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值