以下是我用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);
}
}
转载于:https://blog.51cto.com/siwanghu/1685556