本文主要是介绍数据结构图--课程设计,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
数据结构课程设计-----图的创建及相关操作的实现
输入图的类型(有向图、有向网、无向图、无向网)、图的顶点个数、边的条数、图的顶点信息、各条边以及边的权重(如果是网),任意选用一种数据结构,编写程序将图存入内存,并实现以下的各个操作:
-
存储结构的转换:如果是无向图或无向网,在邻接矩阵、邻接表、邻接多重表之间转换;如果是有向图或有向网,在邻接矩阵、邻接表和逆邻接表、十字链表之间转换;
-
完成增加顶点和删除顶点的功能,删除顶点也要删除与之关联的边;
-
完成增加边和删除边的功能;
-
完成图的深度优先遍历和广度优先遍历;
-
求图的深度优先或广度优先的生成树(或生成森林)(存储结构为孩子-兄弟链表),并对生成树进行遍历;
-
判断图的连通性,输出连通分量的个数;
-
判断图中是否存在环;
-
判断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());
- //DFS
- int 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();
- //BFS
- System.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("不存在环。");
- else
- System.out.println("存在环");
- }
- //判断无向图是否存在环
- else if(type==2){
- if(graph.UDGCircle())
- System.out.println("不存在环。");
- else
- 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是否存在路径");
- 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;*/
- //Dijkstra
- System.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;
- //Floyd
- System.out.println("Floyd算法");
- graph.Floyd();
- //Prime
- System.out.println("Prime算法");
- graph.prime(graph);
- System.out.println();
- for(int i=0;i<graph.vertexs.size();i++)
- graph.vertexs.get(i).vis=false;
- //Kruskal
- System.out.println("Kruskal算法");
- int ans=graph.Kruskal(graph);
- System.out.println("Kruskal求得的最小生成树结果是: "+ans);
- }
- }
这篇关于数据结构图--课程设计的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!