以下是我用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); 
    } 
}