图之邻接多重表

时间:2025-04-15 07:38:17
package ; import ; /** * @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(); ("请分别输入图的顶点数及边数"); numVex = (); numEdge = (); adjMulist = new VexBox[numVex]; ("请分别输入图的各个顶点:"); for(int i = 0; i < numVex; i++){ adjMulist[i] = new VexBox((), null); } ("请输入各个边的起始顶点及其权值value"); for(int k = 0; k < numEdge; k++){ int i = locateVex(()); //输入一条弧的始点,即弧尾 int j = locateVex(()); //输入一条弧的终点,即弧头 int value = (); //输入弧的权重 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; } }