1、public class Graph static final int MaxNum=20; /最大节点数目 /用long的最大数来表示无穷大 static final long MaxValue=9223372036854775807L; char Vertex = new charMaxNum; /定义数组,保存顶点信息 int GType; /图的类型0:无向图,1:有向图 int VertxNum; /顶点的数量 int EdgeNum; /边的数量 long EdgeWeight = new longMaxNumMaxNum; /矩阵保存顶点 int isTrav = new int
2、MaxNum; /用来标记顶点是否已深度遍历 /创建图 public void CreateGraph(Graph g) int i , j , k; long weight; /权 char EstartV, EndV; /边的起始顶点 System.out.println(输入途中各顶点的信息); Scanner scan=new Scanner(System.in); for(i=0; i g.VertxNum; i +) 第 + (i+1) + 个顶点 g.Vertexi = (scan.next().toCharArray()0; 输入构成各边的顶点和权值 for(k=0;kg.Ed
3、geNum;k+) + (k+1) + 条边: EstartV = scan.next().charAt(0); EndV = scan.next().charAt(0); weight = scan.nextInt(); EstartV!=g.Vertexi ; i+);/查找开始节点 for(j=0; EndV != g.Vertexj; j+); /查找终结点 g.EdgeWeightij = weight; /对应边的权重 if(g.GType = 0) /无向图,在对角位置保存权重 g.EdgeWeightji = weight; /清空图,将所有的矩阵元素设为无穷大 public
4、void ClearGraph(Graph g) int i,j; i i+) for(j =0; jg.VertxNum; j+) /设置矩阵中各元素的值为MaxValue g.EdgeWeightij = Graph.MaxValue; /输出邻接矩阵 public void PrintGraph(Graph g) for(j = 0; j j +) System.out.print(t + g.Vertexj); /输入顶点信息 System.out.println(); for(i =0 ;i System.out.print( g.Vertexi);j j+) if(g.EdgeWe
5、ightij = Graph.MaxValue)/若权值为无穷大t& /& 表示无穷大 else + g.EdgeWeightij); /深度遍历 public void DeepTraOne(Graph g,int n) /从第n个节点开始遍历 int i; g.isTravn = 1; /标记为1表示该顶点已经被处理过 System.out.println(g.Vertexn); /输出节点 for(i = 0; i+) if(g.EdgeWeightni != g.MaxValue & g.isTravi = 0) DeepTraOne(g, i); /递归进行遍历 public voi
6、d DeepTraGraph(Graph g) g.isTravi= 0;深度优先遍历: g.VertxNum ; if(g.isTravi = 0) DeepTraOne(g,i); / 开始广度遍历 private int FirstVertex(int v) if (v(Vertex.length-1) return -1; for (int i = 0; Vertex.length; i+) if (EdgeWeightvi = 1) return i; /返回顶点v相对于w的下一个邻接顶点的索引,失败则返回-1 private int NextVertex(int v, int w)
7、 (Vertex.length-1) | w for (int i = w + 1; public void BFS() int head = 0; int rear = 0; int queue = new intVertex.length; / 辅组数组 / 顶点访问标记 boolean visited = new booleanVertex.length; visitedi = false;BFS广度优先遍历: i+) if (!visitedi) visitedi = true;+ Vertexi); queuerear+ = i; while (head != rear) int j
8、 = queuehead+; for (int k = FirstVertex(j); k = 0; k = NextVertex(j, k) /k是为访问的邻接顶点visitedk) visitedk = true;+ Vertexk); queuerear+ = k; /图求度 public void GetDegree(Graph g) /无向图 if(GType=0) int degree=0; for(int i=0;ii+) System.out.print(顶点+Vertexi+的度为: for(int j=0;jj+) if(g.EdgeWeightij!=MaxValue)
9、degree+; System.out.print(degree); System.out.println(); degree=0; /有向图 else int indegree=0; int outdegree=0;的出度为: indegree+; if(g.EdgeWeightji! outdegree+; System.out.print(indegree); 入度为:+outdegree+ indegree=0; outdegree=0;测试编码:public class GraphTest public static void main(String args) Scanner scan=new Scanner(System.in); Graph g = new Graph();输出生成图的类型: g.GType = scan.nextInt(); /图的种类 输入图的顶点数量: g.VertxNum = scan.nex
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1