您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > java教学计划编制的全部代码
packagecurriculumProject;//非连通图的深度优先搜索遍历和广度优先搜索遍历importlinearList.Queue.SeqQueue;//顺序循环队列类publicabstractclassAbstractGraphEimplementsGGraphE//抽象图类{publicabstractintvertexCount();//返回顶点数,方法由子类实现publicabstractEget(inti);//返回顶点vi的数据域publicabstractintgetFirstNeighbor(inti);//返回顶点vi的第一个邻接顶点的序号publicabstractintgetNextNeighbor(inti,intj);//返回vi在vj后的下一个邻接顶点的序号//publicabstractAbstractGraphprim();publicvoidDFSTraverse(intv)//从顶点v出发对非连通图的一次深度优先搜索遍历{boolean[]visited=newboolean[vertexCount()];//访问标记数组,元素初值为false,表示未被访问inti=v;do{if(!visited[i])//若顶点vi未被访问{System.out.print({);depthfs(i,visited);//从顶点vi出发的一次深度优先搜索遍历System.out.print(});}i=(i+1)%vertexCount();//在其他连通分量中寻找未被访问顶点}while(i!=v);System.out.println();}privatevoiddepthfs(intv,boolean[]visited)//从顶点v开始发的一次深度优先搜索遍历{//遍历一个连通分量System.out.print(this.get(v)+);//访问该顶点visited[v]=true;//置已访问标记intw=getFirstNeighbor(v);//获得第一个邻接顶点while(w!=-1)//若存在邻接顶点{if(!visited[w])//若邻接顶点w未被访问depthfs(w,visited);//从w出发的深度优先搜索遍历,递归调用w=getNextNeighbor(v,w);//返回v在w后的下一个邻接顶点的序号}}publicvoidBFSTraverse(intv)//从顶点v出发对非连通图进行一次广度优先搜索遍历{boolean[]visited=newboolean[vertexCount()];//访问标记数组inti=v;do{if(!visited[i])//若顶点vi未被访问{System.out.print({);breadthfs(i,visited);//从顶点vi出发的广度优先搜索遍历System.out.print(});}i=(i+1)%vertexCount();//在其他连通分量中寻找未被访问顶点}while(i!=v);System.out.println();}privatevoidbreadthfs(intv,boolean[]visited)//从顶点v出发的广度优先搜索遍历{//遍历一个连通分量System.out.print(this.get(v)+);visited[v]=true;SeqQueueIntegerque=newSeqQueueInteger(vertexCount());//创建顺序队列que.enqueue(newInteger(v));//访问过的顶点v的序号入队while(!que.isEmpty())//当队列不空时循环{v=que.dequeue().intValue();//出队intw=getFirstNeighbor(v);//获得顶点v的第一个邻接顶点序号while(w!=-1)//当邻接顶点存在时循环{if(!visited[w])//若该顶点未访问过{System.out.print(this.get(w)+);//访问顶点visited[w]=true;que.enqueue(newInteger(w));//访问过的顶点w的序号入队}w=getNextNeighbor(v,w);//返回v在w后的下一个邻接顶点的序号}}}}packagecurriculumProject;//图的邻接表importdataStructure.linearList.SeqList;//顺序表类importlinearList.linkedList.SortedHSLinkedList;//排序的带头结点的单链表类//publicclassAdjListGraphEimplementsGGraphE//邻接表表示的图类publicclassAdjListGraphEextendsAbstractGraphEimplementsGGraphE//邻接表表示的图类{protectedSeqListVertexEvertexlist;//顶点表publicAdjListGraph(intn)//构造方法,n指定顶点数{this.vertexlist=newSeqListVertexE(n);}publicAdjListGraph(E[]vertices,Edge[]edges)//以顶点集合和边集合构造一个图{this(vertices.length);for(inti=0;ivertices.length;i++)insertVertex(vertices[i]);//插入一个顶点for(intj=0;jedges.length;j++)insertEdge(edges[j]);//插入一条边}publicintvertexCount()//返回顶点数{returnthis.vertexlist.length();}publicEget(inti)//返回顶点vi的数据元素{returnthis.vertexlist.get(i).data;}publicbooleaninsertVertex(Evertex)//插入一个顶点,若插入成功,返回true{returnthis.vertexlist.add(newVertexE(vertex));//在顺序表最后插入一个元素}publicbooleaninsertEdge(inti,intj)//插入一条权值为weight的边〈vi,vj〉{if(i=0&&ivertexCount()&&j=0&&jvertexCount()&&i!=j){//SortedHSLinkedListEdgeslink=newSortedHSLinkedListEdge();SortedHSLinkedListslink=this.vertexlist.get(i).adjlink;//slink=this.vertexlist.get(i).adjlink;//System.out.println(this.vertexlist.get(i));returnslink.add(newEdge(i,j));//在第i条单链表最后增加边结点}returnfalse;}publicbooleaninsertEdge(Edgeedge)//插入一条边{if(edge!=null)returninsertEdge(edge.start,edge.dest);returnfalse;}publicStringtoString()//获得图的顶点集合和邻接表{Stringstr=顶点集合:+vertexlist.toString()+\n;str+=出边表:\n;//+edgeCount+条边\n;for(inti=0;ivertexCount();i++)str+=this.vertexlist.get(i).adjlink.toString()+\n;//遍历第i条单链表returnstr;}publicbooleanremoveEdge(inti,intj)//删除边〈vi,vj〉,i、j指定顶点序号{if(i=0&&ivertexCount()&&j=0&&jvertexCount()&&i!=j){SortedHSLinkedListslink=this.vertexlist.get(i).adjlink;//获得第i条边单链表returnslink.remove(newEdge(i,j));}returnfalse;}publicbooleanremoveVertex(intv)//删除序号为v的顶点及其关联的边{//若删除成功,返回trueintn=vertexCount();//删除之前的顶点数if(v=0&&vn){SortedHSLinkedListEdgeslink=this.vertexlist.get(v).adjlink;//获得欲删除的第v条边单链表inti=0;Edgeedge=slink.get(i);while(edge!=null){this.removeEdge(edge.dest,edge.start);//删除对称的边i++;edge=slink.get(i);}this.vertexlist.remove(v);//删除顺序表的第i个元素,顶点数已减一for(i=0;in-1;i++)//未删除的边结点更改某些顶点序号{slink=this.vertexlist.get(i).adjlink;//获得第i条边单链表intj=0;edge=slink.get(j);while(edge!=null){if(edge.startv)edge.start--;//顶点序号减一if(edge.destv)edge.dest--;j++;edge=slink.get(j);}}returntrue;}returnfalse;}publicintgetFirstNeighbor(intv)//返回顶点v的第一个邻接顶点的序号{//若不存在第一个邻接顶点,则返回-1returngetNextNeighbor(v,-1);}publicintgetNextNeighbor(intv,intw)//返回v在w后的下一个邻接顶点的序号{//若不存在下一个邻接顶点,则返回-1if(v=0&&vvertexCount()&&w=-1&&wvertexCount()){SortedHSLinkedListEdgeslink=this.vertexlist.get(v).adjlink;//获得第v条边单链表Edgeedge=slink.get(0);//返回单链表的第一个结点表示的边inti=0;while(edge!=null)//寻找下一个邻接顶点{if(edge.destw)returnedge.dest;//返回下一个邻接顶点的序号i++;edge=slink.get(i);//返回单链表的第一个结点表示的边}}return-1;}}packagecurriculumProject;//带权图的边类publicclassEdgeimplementsComparableEdge//带权值的边类{publicintstart;//边的起点序号publicintdest;//边的终点序号//publicintweight;//边的权值publicEdge(intstart,intdest){this.start=start;this.dest=dest;//this.weight=weight;}publicStringtoString(){return(+start+,+dest+);}publicintcompareTo(Edgee)//约定两条边比较大小的规则{if(this.start!=e.start)returnthis.
本文标题:java教学计划编制的全部代码
链接地址:https://www.777doc.com/doc-3613528 .html