有向图的邻接矩阵表示法(创建,DFS,BFS)
package shiyan; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; public class GraphMartix { class Vertext<AnyType>{ char data; boolean visit; public Vertext(char d){ this.data=d; this.visit=false; } } Vertext ver[]; int arcs[][]; int verNumble; //创建图 Scanner sc=new Scanner(System.in); public void creatGraph(){ System.out.println("请输入顶点个数"); verNumble=sc.nextInt(); ver=new Vertext[verNumble]; arcs=new int[verNumble][verNumble]; for(int i=0;i<verNumble;i++){ for(int j=0;j<verNumble;j++){ arcs[i][j]=0; } } System.out.println("请输入顶点数据"); String point=sc.next(); char p[]=point.toCharArray(); for(int i=0;i<p.length;i++){ ver[i]=new Vertext(p[i]); } for(int i=0;i<verNumble;i++){ System.out.println("请输入 所有的以"+ver[i].data+"为弧尾的边上的另一端点顶点"); String apoint=sc.next(); char ap[]=apoint.toCharArray(); int ap_id[]=new int[ap.length]; //存放邻接点下标 if(ap[0]=='*') ap_id[0]=-1; else{ for(int x=0;x<ap.length;x++){ int y=0; while(ver[y].data!=ap[x]&&y<ver.length){ y++; } ap_id[x]=y; } } if(ap_id[0]==-1) continue; for(int j=0;j<ap_id.length;j++){ arcs[i][ap_id[j]]=1; } } } public void DFS(int v){ ver[v].visit=true; System.out.println(ver[v].data); for(int i=0;i<ver.length;i++){ if(arcs[v][i]==1&&ver[i].visit==false) DFS(i); } } public void BFS(int v){ Queue<Integer> q=new LinkedList<Integer>(); q.add(v); while(!q.isEmpty()){ v=q.poll(); if(ver[v].visit==false){ ver[v].visit=true; System.out.println(ver[v].data); } for(int i=0;i<ver.length;i++){ if(arcs[v][i]==1&&ver[i].visit==false){ q.add(i); } } } } public void du(){ int chu=0; int ru=0; for(int i=0;i<ver.length;i++){ for(int j=0;j<ver.length;j++){ if(arcs[i][j]==1) chu++; if(arcs[j][i]==1) ru++; } System.out.println(ver[i].data+"的度为: "+(chu+ru)); chu=0; ru=0; } } public static void main(String[] args) { GraphMartix gm=new GraphMartix(); gm.creatGraph(); gm.du(); // gm.DFS(0); gm.BFS(0); } }
版权声明:本文为博主原创文章,未经博主允许不得转载。