图 基础java代码.docx
- 文档编号:7509344
- 上传时间:2023-01-24
- 格式:DOCX
- 页数:70
- 大小:29.98KB
图 基础java代码.docx
《图 基础java代码.docx》由会员分享,可在线阅读,更多相关《图 基础java代码.docx(70页珍藏版)》请在冰豆网上搜索。
图基础java代码
publicclassGraph{//undirectedgraph
privatestaticfinalStringNEWLINE=System.getProperty("line.separator");
privatefinalintV;
privateintE;
privateBag
publicGraph(intV){
if(V<0)thrownewIllegalArgumentException("Numberofverticesmustbenonnegative");
this.V=V;
this.E=0;
adj=(Bag
for(intv=0;v adj[v]=newBag } } publicGraph(Inin){ this(in.readInt()); intE=in.readInt(); if(E<0)thrownewIllegalArgumentException("Numberofedgesmustbenonnegative"); for(inti=0;i intv=in.readInt(); intw=in.readInt(); addEdge(v,w); } } publicGraph(GraphG){ this(G.V()); this.E=G.E(); for(intv=0;v //reversesothatadjacencylistisinsameorderasoriginal Stack for(intw: G.adj[v]){ reverse.push(w); } for(intw: reverse){ adj[v].add(w); } } } publicintV(){returnV;} publicintE(){returnE;} privatevoidvalidateVertex(intv){ if(v<0||v>=V) thrownewIndexOutOfBoundsException("vertex"+v+"isnotbetween0and"+(V-1)); } publicvoidaddEdge(intv,intw){ validateVertex(v); validateVertex(w); E++; adj[v].add(w); adj[w].add(v); } publicIterable validateVertex(v); returnadj[v]; } publicintdegree(intv){ validateVertex(v); returnadj[v].size(); } publicStringtoString(){ StringBuilders=newStringBuilder(); s.append(V+"vertices,"+E+"edges"+NEWLINE); for(intv=0;v s.append(v+": "); for(intw: adj[v]){ s.append(w+""); } s.append(NEWLINE); } returns.toString(); } publicstaticvoidmain(String[]args){ Inin=newIn(args[0]); GraphG=newGraph(in); StdOut.println(G); } } publicclassDepthFirstSearch{ privateboolean[]marked;//marked[v]=isthereans-vpath? privateintcount;//numberofverticesconnectedtos publicDepthFirstSearch(GraphG,ints){ marked=newboolean[G.V()]; dfs(G,s); } //depthfirstsearchfromv privatevoiddfs(GraphG,intv){ count++; marked[v]=true; for(intw: G.adj(v)){ if(! marked[w]){ dfs(G,w); } } } publicbooleanmarked(intv){ returnmarked[v]; } publicintcount(){ returncount; } publicstaticvoidmain(String[]args){ Inin=newIn(args[0]); GraphG=newGraph(in); ints=Integer.parseInt(args[1]); DepthFirstSearchsearch=newDepthFirstSearch(G,s); for(intv=0;v if(search.marked(v)) StdOut.print(v+""); } StdOut.println(); if(search.count()! =G.V())StdOut.println("NOTconnected"); elseStdOut.println("connected"); } } importjava.util.Iterator; publicclassNonrecursiveDFS{ privateboolean[]marked;//marked[v]=isthereans-vpath? publicNonrecursiveDFS(GraphG,ints){ marked=newboolean[G.V()]; Iterator for(intv=0;v adj[v]=G.adj(v).iterator(); Stack marked[s]=true; stack.push(s); while(! stack.isEmpty()){ intv=stack.peek(); if(adj[v].hasNext()){ intw=adj[v].next(); if(! marked[w]) marked[w]=true; stack.push(w); } } else{ stack.pop(); } } } publicbooleanmarked(intv){ returnmarked[v]; } publicstaticvoidmain(String[]args){ Inin=newIn(args[0]); GraphG=newGraph(in); ints=Integer.parseInt(args[1]); NonrecursiveDFSdfs=newNonrecursiveDFS(G,s); for(intv=0;v if(dfs.marked(v)) StdOut.print(v+""); StdOut.println(); } } publicclassDepthFirstPaths{ privateboolean[]marked;//marked[v]=isthereans-vpath? privateint[]edgeTo;//edgeTo[v]=lastedgeons-vpath privatefinalints;//sourcevertex publicDepthFirstPaths(GraphG,ints){ this.s=s; edgeTo=newint[G.V()]; marked=newboolean[G.V()]; dfs(G,s); } privatevoiddfs(GraphG,intv){ marked[v]=true; for(intw: G.adj(v)){ if(! marked[w]){ edgeTo[w]=v; dfs(G,w); } } } publicbooleanhasPathTo(intv){ returnmarked[v]; } publicIterable if(! hasPathTo(v))returnnull; Stack for(intx=v;x! =s;x=edgeTo[x]) path.push(x); path.push(s); returnpath; } publicstaticvoidmain(String[]args){ Inin=newIn(args[0]); GraphG=newGraph(in); ints=Integer.parseInt(args[1]); DepthFirstPathsdfs=newDepthFirstPaths(G,s); for(intv=0;v if(dfs.hasPathTo(v)){ StdOut.printf("%dto%d: ",s,v); for(intx: dfs.pathTo(v)){ if(x==s)StdOut.print(x); elseStdOut.print("-"+x); } StdOut.println(); } else{ StdOut.printf("%dto%d: notconnected\n",s,v); } } } } publicclassBreadthFirstPaths{ privatestaticfinalintINFINITY=Integer.MAX_VALUE; privateboolean[]marked;//marked[v]=isthereans-vpath privateint[]edgeTo;//edgeTo[v]=previousedgeonshortests-vpath privateint[]distTo;//distTo[v]=numberofedgesshortests-vpath publicBreadthFirstPaths(GraphG,ints){ marked=newboolean[G.V()]; distTo=newint[G.V()]; edgeTo=newint[G.V()]; bfs(G,s); assertcheck(G,s); } publicBreadthFirstPaths(GraphG,Iterable marked=newboolean[G.V()]; distTo=newint[G.V()]; edgeTo=newint[G.V()]; for(intv=0;v distTo[v]=INFINITY; bfs(G,sources); } //breadth-firstsearchfromasinglesource privatevoidbfs(GraphG,ints){ Queue for(intv=0;v distTo[v]=INFINITY; distTo[s]=0; marked[s]=true; q.enqueue(s); while(! q.isEmpty()){ intv=q.dequeue(); for(intw: G.adj(v)){ if(! marked[w]){ edgeTo[w]=v; distTo[w]=distTo[v]+1; marked[w]=true; q.enqueue(w); } } } } //breadth-firstsearchfrommultiplesources privatevoidbfs(GraphG,Iterable Queue for(ints: sources){ marked[s]=true; distTo[s]=0; q.enqueue(s); } while(! q.isEmpty()){ intv=q.dequeue(); for(intw: G.adj(v)){ if(! marked[w]){ edgeTo[w]=v; distTo[w]=distTo[v]+1; marked[w]=true; q.enqueue(w); } } } } publicbooleanhasPathTo(intv){ returnmarked[v]; } publicintdistTo(intv){ returndistTo[v]; } publicIterable if(! hasPathTo(v))returnnull; Stack for(intx=v;distTo[x]! =0;x=edgeTo[x]) path.push(x); path.push(x); returnpath; } //checkoptimalityconditionsforsinglesource privatebooleancheck(GraphG,ints){ if(distTo[s]! =0){ StdOut.println("distanceofsource"+s+"toitself="+distTo[s]); returnfalse; } //checkthatforeachedgev-wdist[w]<=dist[v]+1 //providedvisreachablefroms for(intv=0;v for(intw: G.adj(v)){ if(hasPathTo(v)! =hasPathTo(w)){ StdOut.println("edge"+v+"-"+w); StdOut.println("hasPathTo("+v+")="+hasPathTo(v)); StdOut.println("hasPathTo("+w+")="+hasPathTo(w)); returnfalse; } if(hasPathTo(v)&&(distTo[w]>distTo[v]+1)){ StdOut.println("edge"+v+"-"+w); StdOut.println("distTo["+v+"]="+distTo[v]); StdOut.println("distTo["+w+"]="+distTo[w]); returnfalse; } } } //checkthatv=edgeTo[w]satisfiesdistTo[w]+distTo[v]+1 //providedvisreachablefroms for(intw=0;w if(! hasPathTo(w)||w==s)continue; intv=edgeTo[w]; if(distTo[w]! =distTo[v]+1){ StdOut.println("shortestpathedge"+v+"-"+w); StdOut.println("distTo["+v+"]="+distTo[v]); StdOut.println("distTo["+w+"]="+distTo[w]); returnfalse; } } returntrue; } publicstaticvoidmain(String[]args){ Inin=newIn(args[0]); GraphG=newGraph(in); //StdOut.println(G); ints=Integer.parseInt(args[1]); BreadthFirstPathsbfs=newBreadthFirstPaths(G,s); for(intv=0;v if(bfs.hasPathTo(v)){ StdOut.printf("%dto%d(%d): ",s,v,bfs.distTo(v)); for(intx: bfs.pathTo(v)){ if(x==s)StdOut.print(x); elseStdOut.print("-"+x); } StdOut.println(); } else{ StdOut.printf("%dto%d(-): notconnected\n",s,v); } } } } publicclassCC{//connectedcomponents privateboolean[]marked;//marked[v]=hasvertexvbeenmarked? privateint[]id;//id[v]=idofconnectedcomponentcontainingv privateint[]size;//size[id]=numberofverticesingivencomponent privateintcount;//numberofconnectedcomponents publicCC(GraphG){ marked=newboolean[G.V()]; id=newint[G.V()]; size=newint[G.V()]; for(intv=0;v if(! marked[v]){ dfs(G,v); count++; } } } privatevoiddfs(GraphG,intv){ marked[v]=true; id[v]=count; size[count]++; for(intw: G.adj(v)){ if(! marked[w]){ dfs(G,w); } } } publicintid(intv){returnid[v];} publicintsize(intv){returnsize[id[v]];} publicintcount(){returncount;} publicbooleanconnected(intv,intw){returnid(v)==id(w);} publicbooleanareConnected(intv,intw){returnid(v)==id(w);} } publicclassBipartite{//DFS privatebooleanisBipartite;//isthegraphbipartite? privateboolean[]color;//color[v]givesverticesononesideofbipartition privateboolean[]marked;//marked[v]=trueifvhasbeenvisitedinDFS privateint[]edgeTo;/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基础java代码 基础 java 代码