以下是我用java實現數據結構中的圖
package com.husiwang.Graph; /** * Created by SiwangHu on 2015/2/4. */ public class Arc { private int Id; //邊編號 private String Name; //邊信息 private int Weight; //邊權值 private Vertex Begin; //邊起點 private Vertex End; //邊終點 public Arc() { Id=0; Name=""; Weight=0; Begin=null; End=null; } public Arc(String name) { Id=0; Name = name; Weight=0; Begin=null; End=null; } public Arc(String name, int weight) { Id=0; Name = name; Weight = weight; Begin=null; End=null; } public Arc(Vertex begin, Vertex end) { Id=0; Name=""; Weight=0; Begin = begin; End = end; } public Arc(Vertex begin, Vertex end, int weight) { Id=0; Name=""; Weight = weight; Begin = begin; End = end; } public Arc(int id, String name, int weight) { Id = id; Name = name; Weight = weight; Begin=null; End=null; } public Arc(String name, int weight, Vertex begin, Vertex end) { Id=0; Name = name; Weight = weight; Begin = begin; End = end; } public Arc(int id, String name, int weight, Vertex end, Vertex begin) { Id = id; Name = name; Weight = weight; End = end; Begin = begin; } public int getId() { return Id; } public String getName() { return Name; } public int getWeight() { return Weight; } public Vertex getBegin() { return Begin; } public Vertex getEnd() { return End; } public void setId(int id) { Id = id; } public void setName(String name) { Name = name; } public void setWeight(int weight) { Weight = weight; } public void setBegin(Vertex begin) { Begin = begin; } public void setEnd(Vertex end) { End = end; } @Override public String toString() { return "Arc{" + "Id=" + Id + ", Name='" + Name + '\'' + ", Weight=" + Weight + ", Begin=" + Begin + ", End=" + End + '}'; } } package com.husiwang.Graph; /** * Created by SiwangHu on 2015/2/4. */ public class Vertex { private int Id; //頂點編號 private String Name; //頂點信息 private int Weight; //頂點權值 public Vertex() { Id=0; Weight=0; Name=""; } public Vertex(String name) { Id=0; Weight=0; Name = name; } public Vertex(int id, String name) { Id = id; Weight=0; Name = name; } public Vertex(String name, int weight) { Id=0; Name = name; Weight = weight; } public Vertex(int id, String name, int weight) { Id = id; Name = name; Weight = weight; } public int getId() { return Id; } public String getName() { return Name; } public int getWeight() { return Weight; } public void setId(int id) { Id = id; } public void setName(String name) { Name = name; } public void setWeight(int weight) { Weight = weight; } @Override public String toString() { return "Vertex{" + "Id=" + Id + ", Name='" + Name + '\'' + ", Weight=" + Weight + '}'; } } package com.husiwang.Graph; import com.husiwang.Queue.Queue; /** * Created by SiwangHu on 2015/2/4. */ public class Graph { private int Id; //圖編號 private boolean GraphKind; //圖種類 private Arc[] arcs; //邊 private Vertex[] vertexes; //頂點 private int VertexNum; //頂點數 private int ArcNum; //邊數 private int[][] Weight; //鄰接矩陣 private Visit Visited; //默認遍歷回調函數 boolean[] flags; //遍歷參數 public Graph() { Id=0; GraphKind=true; arcs=null; vertexes=null; VertexNum=0; ArcNum=0; Weight=null; Visited=new Visit(); } public Graph(Arc[] arc,int vertexNum,boolean isDirection){ Weight=new int[vertexNum][vertexNum]; for(int i=0;i<vertexNum;i++){ for(int j=0;j<vertexNum;j++){ if(i==j) Weight[i][j]=0; else Weight[i][j]=-1; } } for(int i=0;i<arc.length;i++){ if(isDirection) Weight[arc[i].getBegin().getId()][arc[i].getEnd().getId()]=arc[i].getWeight(); else { Weight[arc[i].getBegin().getId()][arc[i].getEnd().getId()]=arc[i].getWeight(); Weight[arc[i].getEnd().getId()][arc[i].getBegin().getId()]=arc[i].getWeight(); } } VertexNum=vertexNum; Visited=new Visit(); Init(arc,isDirection); } public Graph(Arc[] arc,Vertex[] vertex,boolean isDirection){ this(arc,vertex.length,isDirection); } public void Create(Arc[] arc,int vertexNum,boolean isDirection){ Weight=new int[vertexNum][vertexNum]; for(int i=0;i<vertexNum;i++){ for(int j=0;j<vertexNum;j++){ if(i==j) Weight[i][j]=0; else Weight[i][j]=-1; } } for(int i=0;i<arc.length;i++){ if(isDirection) Weight[arc[i].getBegin().getId()][arc[i].getEnd().getId()]=arc[i].getWeight(); else { Weight[arc[i].getBegin().getId()][arc[i].getEnd().getId()]=arc[i].getWeight(); Weight[arc[i].getEnd().getId()][arc[i].getBegin().getId()]=arc[i].getWeight(); } } VertexNum=vertexNum; Init(arc, isDirection); } public void Create(Arc[] arc,Vertex[] vertex,boolean isDirection){ Create(arc,vertex.length,isDirection); } public Vertex getFirstNext(int id){ if(id<VertexNum){ for(int i=0;i<VertexNum;i++){ if(Weight[id][i]!=-1&&Weight[id][i]!=0){ return vertexes[i]; } } return null; } else{ throw new RuntimeException("頂點信息錯誤"); } } public Vertex getFirstNext(Vertex vertex){ return getFirstNext(vertex.getId()); } public void DFSTraverse(Visit visited){ flags=new boolean[VertexNum]; for(int i=0;i<flags.length;i++){ flags[i]=false; } for(int i=0;i<VertexNum;i++){ if(flags[i]==false){ DFS(i,visited); } } } public void DFSTraverse(){ DFSTraverse(Visited); } private void DFS(int i,Visit visited){ flags[i]=true; visited.visited(vertexes[i]); for(int j=0;j<VertexNum;j++){ if(flags[j]==false&&Weight[i][j]!=0&&Weight[i][j]!=-1){ DFS(j,visited); } } } public void BFSTraverse(){ BFSTraverse(Visited); } public void BFSTraverse(Visit visited){ flags=new boolean[VertexNum]; for(int i=0;i<flags.length;i++){ flags[i]=false; } Queue queue=new Queue(); for(int i=0;i<VertexNum;i++){ if(flags[i]==false){ flags[i]=true; visited.visited(vertexes[i]); queue.enQueue(i); while(!queue.IsEmpty()){ int j=Integer.parseInt(String.valueOf(queue.deQueue())); for(int k=0;k<VertexNum;k++){ if(Weight[j][k]!=0&&Weight[j][k]!=-1&&flags[k]==false){ flags[k]=true; visited.visited(vertexes[k]); queue.enQueue(k); } } } } } } public void Init(Arc[] arc,boolean isDirection){ GraphKind=isDirection; ArcNum=arc.length; arcs=new Arc[arc.length]; for(int i=0;i<arc.length;i++){ arcs[i]=arc[i]; } ParseArcs(arc); } public void ParseArcs(Arc[] arcs){ vertexes=new Vertex[VertexNum]; for (int i = 0; i <arcs.length ; i++) { vertexes[arcs[i].getBegin().getId()]=arcs[i].getBegin(); vertexes[arcs[i].getEnd().getId()]=arcs[i].getEnd(); } } public int getId() { return Id; } public boolean isDirection() { return GraphKind; } public int getVertexNum() { return VertexNum; } public int getArcNum() { return ArcNum; } public Arc[] getArcs() { return arcs; } public Vertex[] getVertexes() { return vertexes; } @Override public String toString() { String direction="",array=""; if(GraphKind==true) direction="有向圖"; else{ direction="無向圖"; } for(int i=0;i<VertexNum;i++){ for(int j=0;j<VertexNum;j++){ array+=Weight[i][j]+" "; } array+="\\n"; } return "Graph{" + "Id=" + Id + ", GraphKind=" + direction + ", VertexNum=" + VertexNum + ", ArcNum=" + ArcNum + ", Weight=" + array + '}'; } } package com.husiwang.Graph; /** * Created by Administrator on 2015/2/5. */ public class Visit { public void visited(Vertex vertex){ System.out.println(vertex); } }