各种图的各种操作
来源:互联网 发布:js兼容性问题 编辑:程序博客网 时间:2024/05/01 17:28
数据结构课程设计-----图的创建及相关操作的实现
输入图的类型(有向图、有向网、无向图、无向网)、图的顶点个数、边的条数、图的顶点信息、各条边以及边的权重(如果是网),任意选用一种数据结构,编写程序将图存入内存,并实现以下的各个操作:
存储结构的转换:如果是无向图或无向网,在邻接矩阵、邻接表、邻接多重表之间转换;如果是有向图或有向网,在邻接矩阵、邻接表和逆邻接表、十字链表之间转换;
完成增加顶点和删除顶点的功能,删除顶点也要删除与之关联的边;
完成增加边和删除边的功能;
完成图的深度优先遍历和广度优先遍历;
求图的深度优先或广度优先的生成树(或生成森林)(存储结构为孩子-兄弟链表),并对生成树进行遍历;
判断图的连通性,输出连通分量的个数;
判断图中是否存在环;
判断u到v是否存在路径;
对于图(不是网),求顶点u到v的一条简单路径;
对于图(不是网),求顶点u到v的所有简单路径;
实现Dijkstra和Floyd算法求最短路径;
实现普里姆或克鲁斯卡尔算法求最小生成树。
package GraphDemo;public class Vertex<AnyType>{public AnyType data;public Arc firstArc;public boolean vis;public boolean primVis;public int inDegree;public int outDegree;public int degree;public int topNum;public int dist;public int primDist;public int weight;public Vertex(AnyType data,Arc firstArc){this.data=data;this.firstArc=firstArc;}public Vertex(AnyType data){this(data,null);}}
package GraphDemo;import TwoWayLinkedListDemo.TwoWayLinkedListNode;public class Arc{int vex;int adjVex;public Arc nextArc;int weight;public Arc(){}public Arc(int adjVex,Arc nextArc,int weight){this.adjVex=adjVex;this.nextArc=nextArc;this.weight=weight;}public Arc(int adjVex,int weight){this(adjVex,null,weight);}public Arc(int adjVex,Arc nextArc){this(adjVex,nextArc,1);}public Arc(int adjVex){this(adjVex,null,1);}}
package GraphDemo;public class Node<AnyType>{AnyType data;Node<AnyType> firstChild,Sibling;Node(){data=null;firstChild=Sibling=null;}Node(AnyType data){this.data=data;firstChild=Sibling=null;}Node(AnyType data,Node<AnyType>lt,Node<AnyType>rt){this.data=data;firstChild=lt;Sibling=rt;}public Node<AnyType>getleftChild(){return firstChild;}public Node<AnyType>getrigthChild(){return Sibling;}}
package GraphDemo;class DisjSets{public int s[];public DisjSets(int numElements){s=new int[numElements];for(int i=0;i<s.length;i++)s[i]=i;}public void union(int root1,int root2){int x,y;x=find(root1);y=find(root2);if(x!=y) s[y]=x;}public int find(int x){while(x!=s[x])x=s[x];return x;}}
package GraphDemo;import java.util.ArrayList;import java.util.Comparator;import java.util.HashMap;import java.util.LinkedList;import java.util.List;import java.util.Map;import java.util.PriorityQueue;import java.util.Queue;import java.util.Scanner;import java.util.Stack;public class Graph<AnyType>{int DG=1,UNG=2,DN=3,UND=4;int vexNum;int arcNum;int type;int count;int INF=0xfffff;Node first;LinkedList<Vertex> vertexs=new LinkedList<Vertex>();public Graph(int type,int vexNum,int arcNum){this.type=type;this.arcNum=arcNum;this.vexNum=vexNum;}//创建图public Graph(){}//创建有向图public void createDG(List<AnyType>v,List<Integer>a,List<Integer> b,List<Integer> x){for(int i=0;i<vexNum;i++)vertexs.add(new Vertex<AnyType>(v.get(i)));for(int i=0;i<a.size();i++){int arc1=a.get(i);int arc2=b.get(i);Vertex<AnyType> ver=vertexs.get(arc1);Arc arc=new Arc(arc2);arc.vex=arc1;arc.weight=x.get(i);arc.nextArc=ver.firstArc;ver.firstArc=arc;}}//创建无向图public void createUDG(List<AnyType> v,List<Integer> a,List<Integer> b,List<Integer> x){for(int i=0;i<vexNum;i++)vertexs.add(new Vertex<AnyType>(v.get(i)));for(int i=0;i<a.size();i++){int arc1=a.get(i);int arc2=b.get(i);Vertex<AnyType> ver=vertexs.get(arc1);Arc p=new Arc(arc2);p.nextArc=ver.firstArc;ver.firstArc=p;Arc q=new Arc(arc1);ver=vertexs.get(arc2);q.nextArc=ver.firstArc;ver.firstArc=q;q.weight=x.get(i);p.weight=x.get(i);}}//创建有向网public void createDN(List<AnyType> v,List<Integer> a,List<Integer> b,List<Integer> x){for(int i=0;i<vexNum;i++)vertexs.add(new Vertex<AnyType>(v.get(i)));for(int i=0;i<a.size();i++){ int arc1=a.get(i); int arc2=b.get(i); int weight=x.get(i); Vertex<AnyType> ver=vertexs.get(arc1); Arc arc=new Arc(arc2,weight); arc.nextArc=ver.firstArc; ver.firstArc=arc; } }//创建无向网 public void createUDN(List<AnyType> v,List<Integer> a,List<Integer> b,List<Integer> x){for(int i=0;i<vexNum;i++)vertexs.add(new Vertex<AnyType>(v.get(i)));for(int i=0;i<a.size();i++){ int arc1=a.get(i); int arc2=b.get(i); Vertex<AnyType> ver=vertexs.get(arc1); Arc p=new Arc(arc2); p.nextArc=ver.firstArc; ver.firstArc=p; Arc q=new Arc(arc1); ver=vertexs.get(arc2); q.nextArc=ver.firstArc; ver.firstArc=q; q.weight=x.get(i); p.weight=x.get(i);} } public void createGraph(int type,List<AnyType> v,List<Integer> a,List<Integer> b,List<Integer> x){ if(vexNum<=0||arcNum<0){ System.out.println("您创建的图有误!"); return; } switch(type){ case 1:createDG(v,a,b,x);break; case 2:createUDG(v,a,b,x);break; case 3:createDN(v,a,b,x);break; case 4:createUDN(v,a,b,x);break; default:System.out.println("您指定的图的类型有误!"); } } //求第一个邻接点 public int firstAdjVex(int v){ if(v<0||v>vexNum){ System.out.println("输入不合法!"); } Vertex<AnyType> ver=vertexs.get(v); Arc p=ver.firstArc; if(p!=null)return p.adjVex; return -1; } //求下一条边 public int nextAdjVex(int v,int w){ if(v<0||v>=vexNum){ System.out.println("输入不合法!"); } Vertex<AnyType> ver=vertexs.get(v); Arc arc=ver.firstArc; int next=arc.adjVex; while(arc!=null&&next!=w){ arc=arc.nextArc; next=arc.adjVex; } if(arc!=null) arc=arc.nextArc; if(arc!=null)return arc.adjVex; return -1; } //求出度 public int outDegree(int v){ int outDegree=0; Vertex<AnyType> ver=vertexs.get(v); Arc arc=ver.firstArc; while(arc!=null){ outDegree++; arc=arc.nextArc; } return outDegree; } //求入度 public int inDegree(int v){ int inDegree=0; for(int i=0;i<vexNum;i++){ if(i==v)continue; Vertex<AnyType> ver=vertexs.get(i); Arc arc=ver.firstArc; while(arc!=null){ if(arc.adjVex==v){ inDegree++; break; } arc=arc.nextArc; } } return inDegree; } //邻接表转换为邻接矩阵 public int[][] getAdjacencyMatrix(){ int[][] adjacencyMatrix=new int[vexNum][vexNum]; for(int i=0;i<vexNum;i++){ Vertex<AnyType> ver=vertexs.get(i); Arc arc=ver.firstArc; for(int j=firstAdjVex(i);j>=0;j=nextAdjVex(i,j)){ adjacencyMatrix[i][j]=arc.weight; arc=arc.nextArc; } } return adjacencyMatrix; } //打印邻接矩阵 public void printAdjacencyMatrix(){ int[][] adjacencyMatrix=getAdjacencyMatrix(); for(int i=0;i<adjacencyMatrix.length;i++) { for(int j=0;j<adjacencyMatrix[i].length;j++) System.out.print(adjacencyMatrix[i][j]+" "); System.out.println(); } } //插入节点 public void insertVertex(AnyType data){ vertexs.add(new Vertex<AnyType>(data)); vexNum++; } //删除节点 public void delete(AnyType a){ int i; for(i=0;i<vexNum;i++) if(vertexs.get(i).data.equals(a)) break; if(i==vexNum){ System.out.println("您所删除的元素不存在!"); return; } for(int j=firstAdjVex(i);j>=0;j=nextAdjVex(i,j)){ if(type==2||type==4) vertexs.get(j).degree--; else{ vertexs.get(j).inDegree--; vertexs.get(j).degree--; } } vertexs.remove(i); vexNum--; for(int j=0;j<vexNum;j++){ Vertex<AnyType> v=vertexs.get(j); Arc arc=v.firstArc; if(arc!=null){ if(arc.adjVex==i){ v.firstArc=v.firstArc.nextArc; if(type==2||type==4) v.degree--; else{ v.outDegree--; v.degree--; } continue; } while(arc.nextArc!=null){ if(arc.nextArc.adjVex==i){ arc.nextArc=arc.nextArc.nextArc; if(type==2||type==4){ v.degree--; } else if(type==1||type==3){ arc=arc.nextArc; v.outDegree--; v.degree--; } break; } arc=arc.nextArc; } } } } //删除边 public void removeEdege(int i,int a){ Arc q=vertexs.get(i).firstArc; if(q.adjVex==a) vertexs.get(i).firstArc=q.nextArc; while(q.nextArc!=null){ if(q.nextArc.adjVex==a){ q.nextArc=q.nextArc.nextArc; break; } q=q.nextArc; } } //增加边 public void addEdege(int ss[],int ee[],int num){ for(int i=0;i<num;i++){ Arc tmp1=new Arc(); tmp1.adjVex=ee[i]; Arc q=vertexs.get(ss[i]).firstArc; tmp1.nextArc=q; vertexs.get(ss[i]).firstArc=tmp1; } } //DFS void DFS(int start){ if(start>=vexNum)return; Vertex<AnyType> tmp=vertexs.get(start); tmp.vis=true; System.out.print(tmp.data+" "); if(tmp.firstArc!=null){ for(int w=tmp.firstArc.adjVex;w>=0;w=nextAdjVex(start,w)){ if(vertexs.get(w).vis==false) DFS(w); } } } //BFS void BFS(int start){ Queue<Integer> queue=new LinkedList<Integer>(); vertexs.get(start).vis=true; queue.add(start); while(!queue.isEmpty()){ int tmp1=queue.remove(); System.out.print(vertexs.get(tmp1).data+" "); int tmp2=firstAdjVex(tmp1); while(tmp2!=-1){ if(vertexs.get(tmp2).vis==false){ vertexs.get(tmp2).vis=true; queue.add(tmp2); } tmp2=nextAdjVex(tmp1,tmp2); } } } //深度优先遍历最小生成树 public void DFSTree(int v){ first=new Node<AnyType>(); first.data=vertexs.get(v).data; DFSTree(v,first); } void DFSTree(int v,Node T){ vertexs.get(v).vis=true; int w; Node p; boolean first=true; Node q=null; System.out.print(T.data+" "); for(w=firstAdjVex(v);w>=0;w=nextAdjVex(v,w)) if(!vertexs.get(w).vis){ p=new Node(vertexs.get(w).data); if(first){ T.firstChild=p; first=false; } else q.Sibling=p; q=p; DFSTree(w,q); } } //广度优先遍历最小生成树(先序遍历) public void preOrderTree(){ if(first!=null)preOrderTree(first); } public void preOrderTree(Node<AnyType> t){ if(t!=null){ System.out.print(t.data+" ");//遍历根 preOrderTree(t.firstChild);//遍历左子树 preOrderTree(t.Sibling);//遍历右子树 } } //判断有向图是否存在环 public boolean isDGCircle(){ Queue<Vertex> q=new LinkedList<Vertex>(); int count=0; for(int i=0;i<vertexs.size();i++) if(vertexs.get(i).inDegree==0) q.add(vertexs.get(i)); while(!q.isEmpty()){ Vertex v=q.poll(); count++; Arc p=null; for(p=v.firstArc;p!=null;p=p.nextArc) if(--vertexs.get(p.adjVex).inDegree==0) q.add(vertexs.get(p.adjVex)); } if(count!=vexNum)return false; else return true; } //判断无向图是否存在环 public boolean UDGCircle(){ if(arcNum>vexNum-1) return false; else return true; } //BFS判断是否存在路径 public boolean BFSRoute(Graph<AnyType> g,int u,int v){ Queue<Integer> queue=new LinkedList<Integer>(); g.vertexs.get(u).vis=true; queue.add(u); while(!queue.isEmpty()){ int tmp1=queue.remove(); if(tmp1==v){ for(int i=0;i<g.vertexs.size();i++) g.vertexs.get(i).vis=false; return true; } int tmp2=firstAdjVex(tmp1); while(tmp2!=-1){ if(g.vertexs.get(tmp2).vis==false){ queue.add(tmp2); g.vertexs.get(tmp2).vis=true; } tmp2=nextAdjVex(tmp1,tmp2); } } for(int i=0;i<g.vertexs.size();i++) g.vertexs.get(i).vis=false; return false; } //判断U到V是否存在路径 public boolean isURouteV(Graph<AnyType> g,int u,int v){ if(BFSRoute(g,u,v)==true) return true; return false; } //求一条从U到V的简单路径 public LinkedList<Integer> oneURouteV(Graph<AnyType> g,int u,int v){ Map<Integer,Integer> parent=new HashMap<Integer,Integer>(); LinkedList<Integer> tmp=new LinkedList<Integer>(); if(isURouteV(g,u,v)==true){ Queue<Integer> queue=new LinkedList<Integer>(); for(int i=0;i<g.vertexs.size();i++) parent.put(i,i); g.vertexs.get(u).vis=true; queue.add(u); while(!queue.isEmpty()){ int tmp1=queue.remove(); if(tmp1==v)break; int tmp2=firstAdjVex(tmp1); while(tmp2!=-1){ if(g.vertexs.get(tmp2).vis==false){ parent.put(tmp2,tmp1); queue.add(tmp2); g.vertexs.get(tmp2).vis=true; } tmp2=nextAdjVex(tmp1,tmp2); } } //存路径 int x=v; while(x!=u){ tmp.add(x); x=parent.get(x); } tmp.add(u); return tmp; } else{ System.out.println("两点之间没有路径。"); return null; } } //求U到V的所有路径 public void allURouteV(Graph<AnyType> g,int u,int v){ LinkedList<Integer> stack=new LinkedList<Integer>(); count=1; stack.addLast(u); for(int i=firstAdjVex(u);i!=-1;i=nextAdjVex(u,i)){ if(g.vertexs.get(i).vis==false){ g.vertexs.get(i).vis=true; stack.addLast(i); search(g,i,v,stack); g.vertexs.get(i).vis=false; stack.pollLast(); } } } public void search(Graph<AnyType> g,int x,int v,LinkedList<Integer> ss){ if(x==v){ System.out.print("路径"+count+":"); count++; for(int i=0;i<ss.size()-1;i++) System.out.print(g.vertexs.get(ss.get(i)).data+"->"); System.out.println(g.vertexs.get(ss.get(ss.size()-1)).data); return; } else{ for(int j=firstAdjVex(x);j!=-1;j=nextAdjVex(x,j)) if(g.vertexs.get(j).vis==false){ g.vertexs.get(j).vis=true; ss.addLast(j); search(g,j,v,ss); g.vertexs.get(j).vis=false; ss.pollLast(); } } } //Dijkstra int pre[]=new int[107]; Map<Integer,Integer> parents=new HashMap<Integer,Integer>(); public void Dijkstra(Graph<AnyType> g,Vertex<AnyType> s,int start){ LinkedList<Integer> tmp=new LinkedList<Integer>(); for(int i=0;i<g.vertexs.size();i++){ pre[i]=start; g.vertexs.get(i).dist=INF; g.vertexs.get(i).vis=false; parents.put(i,i); } s.dist=0; for(int i=0;i<g.vertexs.size();i++){ int min=INF; int v=0; for(int j=0;j<g.vertexs.size();j++) if(g.vertexs.get(j).vis==false&&g.vertexs.get(j).dist<min){ min=g.vertexs.get(j).dist; v=j; } g.vertexs.get(v).vis=true; for(int j=0;j<g.vertexs.size();j++) if(g.vertexs.get(j).vis==false&&weigthWith(v,j)!=-1){ if(g.vertexs.get(j).dist>g.vertexs.get(v).dist+weigthWith(v,j)){ g.vertexs.get(j).dist=g.vertexs.get(v).dist+weigthWith(v,j); pre[j]=v; parents.put(j,v); } } } } public void printPath(Graph<AnyType>g,int u,int v){ int x=v; LinkedList<Integer> tmp=new LinkedList<Integer>(); while(x!=u){ tmp.add(x); x=parents.get(x); } tmp.add(u); for(int i=tmp.size()-1;i>0;i--)System.out.print(g.vertexs.get(tmp.get(i)).data+"->"); System.out.println(g.vertexs.get(tmp.get(0)).data); } public void printPath(int s,int e,int num){ int a[]=new int[107],i,k; k=0; a[k++]=e; i=e; while(s!=i){ i=pre[i]; a[k++]=i; } System.out.print("Path"+num+": "); for(i=k-1;i>0;i--) System.out.print(a[i]+"-->"); System.out.println(a[0]); } //判断v到w是否存在路径,并返回其权值 public int weigthWith(int v,int w){ Arc p=vertexs.get(v).firstArc; if(p==null)return -1; while(p!=null&&p.adjVex!=w) p=p.nextArc; if(p==null)return -1; return p.weight; } //Kruskal public int Kruskal(Graph<AnyType> g){ int edgesAccept=0,ans=0; LinkedList<Arc> minTree=new LinkedList<Arc>(); PriorityQueue<Arc> pq=new PriorityQueue<Arc>(100,new Comparator<Arc>(){ public int compare(Arc a,Arc b){ if(a.weight>b.weight)return 1; else return -1; } }); for(int i=0;i<g.vertexs.size();i++){ Arc p=g.vertexs.get(i).firstArc; while(p!=null){ pq.add(p); p=p.nextArc; } } DisjSets ds=new DisjSets(100); Arc edge; int u,v; while(edgesAccept<g.vertexs.size()-1){ edge=pq.poll(); u=edge.vex; v=edge.adjVex; int uset=ds.find(u); int vset=ds.find(v); if(uset!=vset){ edgesAccept++; ds.union(u,v); minTree.add(edge); ans+=edge.weight; } } return ans; } //prime public void prime(Graph<AnyType> g){ for(int i=0;i<g.vertexs.size();i++){ g.vertexs.get(i).primDist=INF; g.vertexs.get(i).primVis=false; } g.vertexs.get(0).primDist=0; int count=0; for(int i=0;i<g.vertexs.size();i++){ int min=INF; int v=0; for(int j=0;j<g.vertexs.size();j++) if(g.vertexs.get(j).primVis==false&&g.vertexs.get(i).primDist<min){ min=g.vertexs.get(i).primDist; v=j; } g.vertexs.get(v).primVis=true; count+=min; System.out.print(g.vertexs.get(v).data+" "); if(i==g.vertexs.size()-1) { System.out.println("\n最小生成树的值是:"+count); break; } for(int j=0;j<g.vertexs.size();j++) if(g.vertexs.get(j).primVis==false&&weigthWith(v,j)!=-1) if(g.vertexs.get(j).primDist>weigthWith(v,j)) g.vertexs.get(j).primDist=weigthWith(v,j); } } public void Floyd(){ int[][] adjacencyMartix=getAdjacencyMatrix(); for(int i=0;i<adjacencyMartix.length;i++) for(int j=0;j<adjacencyMartix[i].length;j++) if(adjacencyMartix[i][j]==0) adjacencyMartix[i][j]=INF; for(int k=0;k<adjacencyMartix.length;k++) for(int i=0;i<adjacencyMartix.length;i++) for(int j=0;j<adjacencyMartix[i].length;j++) if(i!=j&&adjacencyMartix[i][k]+adjacencyMartix[k][j]<adjacencyMartix[i][j]) adjacencyMartix[i][j]=adjacencyMartix[i][k]+adjacencyMartix[k][j]; for(int i=0;i<adjacencyMartix.length;i++){ System.out.print("点"+i+"到其它点的最短距离是:"); for(int j=0;j<adjacencyMartix[i].length;j++) if(adjacencyMartix[i][j]==INF) System.out.print("不存在 "); else System.out.print(adjacencyMartix[i][j]+" "); System.out.println(); } }}
package GraphDemo;import java.util.ArrayList;import java.util.LinkedList;import java.util.List;import java.util.Scanner;public class Test{public static void main(String args[]){Scanner cin=new Scanner(System.in);int INF=0xfffff;//建图System.out.println("请输入要建的图的类型:\n1:有向图 2:无向图 3:有向网 4:无向网");int type=cin.nextInt();System.out.println("请输入节点个数和边的条数:");int vnum=cin.nextInt();int anum=cin.nextInt();Graph<String>graph =new Graph<String>(type,vnum,anum);List<String>v=new ArrayList<String>();List<Integer> a=new ArrayList<Integer>();List<Integer> b=new ArrayList<Integer>();List<Integer> x=new ArrayList<Integer>();System.out.println("请输入"+vnum+"个节点:");for(int i=0;i<vnum;i++)v.add(cin.next());if(type==3||type==4)System.out.println("请输入"+anum+"条边及其权值:");else System.out.println("请输入"+anum+"条边:");for(int i=0;i<anum;i++){a.add(cin.nextInt());b.add(cin.nextInt());if(type==3||type==4)x.add(cin.nextInt());else x.add(1);}graph.createGraph(type,v,a,b,x);//邻接表转换为邻接矩阵System.out.println("邻接表转换为邻接矩阵是:");graph.printAdjacencyMatrix();for(int i=0;i<graph.vertexs.size();i++)graph.vertexs.get(i).vis=false;//增加顶点/*System.out.println("请输入要增加顶点的个数:");int addnum=cin.nextInt();System.out.println("请输入顶点:");for(int i=0;i<addnum;i++)graph.insertVertex(cin.next());//增加边System.out.println("请输入要增加边的条数:");int addarc=cin.nextInt();int ss[]=new int [100];int ee[]=new int [100];System.out.println("请输入边的信息:");for(int i=0;i<addarc;i++){ss[i]=cin.nextInt();ee[i]=cin.nextInt();}graph.addEdege(ss,ee,addarc);//删除点System.out.println("请输入要删除的点的个数:");int delenum=cin.nextInt();System.out.println("请输入要删除点的信息:");for(int i=0;i<delenum;i++)graph.delete(cin.next());//删除边System.out.println("请输入要删除边的条数:");int delearc=cin.nextInt();System.out.println("请输入要删除边的信息:");for(int i=0;i<delearc;i++)graph.removeEdege(cin.nextInt(),cin.nextInt());//DFSint count=0;System.out.println("图的深度优先遍历结果是:");for(int i=0;i<graph.vertexs.size();i++)if(graph.vertexs.get(i).vis==false){graph.DFS(i);count++;}for(int i=0;i<graph.vertexs.size();i++)graph.vertexs.get(i).vis=false;System.out.println();//BFSSystem.out.println("图的广度优先遍历结果是:");for(int i=0;i<graph.vertexs.size();i++)if(graph.vertexs.get(i).vis==false){graph.BFS(i);}for(int i=0;i<graph.vertexs.size();i++)graph.vertexs.get(i).vis=false;System.out.println();System.out.println("DFS生成树和BFS生成树,请输入要遍历的点的编号:");//DFS生成树int startnum=cin.nextInt();System.out.println("图的深度优先生成树:");graph.DFSTree(startnum);System.out.println();//BFS生成树System.out.println("图的广度优先生成树:");graph.preOrderTree();System.out.println();//判断联通分量的个数System.out.println("图的连通分量的个数是:"+count);//判断是否存在环//判断有向图是否存在环if(type==1){for(int i=0;i<graph.vertexs.size();i++){graph.vertexs.get(i).inDegree=graph.inDegree(i);graph.vertexs.get(i).outDegree=graph.outDegree(i);}if(graph.isDGCircle())System.out.println("不存在环。");elseSystem.out.println("存在环");}//判断无向图是否存在环else if(type==2){if(graph.UDGCircle())System.out.println("不存在环。");elseSystem.out.println("存在环");}for(int i=0;i<graph.vertexs.size();i++)graph.vertexs.get(i).vis=false;//判断u到v是否存在路径System.out.println("请输入u和v判断,u->v是否存在路径");if(graph.isURouteV(graph,cin.nextInt(),cin.nextInt()))System.out.println("u到v存在路径。");else System.out.println("u到v不存在路径。");for(int i=0;i<graph.vertexs.size();i++)graph.vertexs.get(i).vis=false;//求一条u到v的路径System.out.println("请输入u和v并求出u->v的一条简单路径");LinkedList<Integer> g=graph.oneURouteV(graph,cin.nextInt(),cin.nextInt());for(int i=g.size()-1;i>=0;i--)System.out.print(graph.vertexs.get(g.get(i)).data+" ");System.out.println();for(int i=0;i<graph.vertexs.size();i++)graph.vertexs.get(i).vis=false;//求u到v的所有路径System.out.println("请输入u和v并求出u->v的所有路径");graph.allURouteV(graph,cin.nextInt(),cin.nextInt());for(int i=0;i<graph.vertexs.size();i++)graph.vertexs.get(i).vis=false;*///DijkstraSystem.out.println("Dijkstra算法\n请输入起点:");int startDij=cin.nextInt(),num=0;graph.Dijkstra(graph,graph.vertexs.get(startDij),startDij);for(int i=0;i<graph.vertexs.size();i++)if(graph.vertexs.get(i).dist!=INF&&i!=startDij){graph.printPath(graph,startDij,i);graph.printPath(startDij,i,++num);}System.out.println("点"+startDij+"到其它点的最短路径分别是:");for(int i=0;i<graph.vertexs.size();i++)if(graph.vertexs.get(i).dist!=INF)System.out.println("到点"+i+"的最短距离是:"+graph.vertexs.get(i).dist);else System.out.println("到点"+i+"不存在最短距离。");for(int i=0;i<graph.vertexs.size();i++)graph.vertexs.get(i).vis=false;//FloydSystem.out.println("Floyd算法");graph.Floyd();//PrimeSystem.out.println("Prime算法");graph.prime(graph);System.out.println();for(int i=0;i<graph.vertexs.size();i++)graph.vertexs.get(i).vis=false;//KruskalSystem.out.println("Kruskal算法");int ans=graph.Kruskal(graph);System.out.println("Kruskal求得的最小生成树结果是: "+ans);}}
0 0
- 各种图的各种操作
- 图的各种操作总结
- 文件的各种操作
- 单链表的各种操作
- 各种操作的计时
- 单链表的各种操作
- 树的各种操作
- 红黑树的各种操作
- 数据表的各种操作
- 各种数据库的操作
- 单链表的各种操作
- FTP的各种操作
- 单链表的各种操作
- 字符串的各种操作
- 单链表的各种操作
- 堆的各种操作
- 字符串的各种操作
- 无头单链表的各种操作
- 文件夹的创建与删除
- Mahout 入门构建一个推荐引擎
- C++------------typedef 函数指针类型定义
- cocos2d-x游戏开发系列教程-中国象棋00-前言
- SQL将 NULL值转换为0
- 各种图的各种操作
- ACM Regionals 2006 :: Asia - Shanghai 遥远的银河(部分枚举+扫描+动态维护)
- Feature Service(一)
- 【VC编程技巧】窗体☞3.1利用字体对话框和颜色对话框改变静态标签中字体颜色背景.
- 【创业大爆炸之心篇】平常心,做自己。——创业是写给自己的墓志铭
- iPhone架构xmpp聊天工具 -xmpp协议初识《一》
- matlab并行运算(parallel computing)
- MFC 消息机制 AfxWndProc->AfxCallWndProc->WindowProc->OnWndMsg
- MySQL 里设置或修改系统变量的几种方法