java数据结构-图的深度优先搜索和广度优先搜索

//图
//图由边和定点来表示,可以抽象为像是世界中的一种模型


class Vertex{
private char label;
private boolean wasVisited;
public Vertex(char c){
this.label=c;
wasVisited=false;
}
public void showVertex(){
System.out.print(label+" ");
}
public char getVertex(){
return label;
}
public void setVisited(){
wasVisited=true;
}
public boolean wasVisited(){
return wasVisited;
}
public void rVisited(){
wasVisited=false;
}
}








class Graph{
private Vertex[] vertexList;
private int[][] adjMat;
private int nVertex;
private int sCount;

public Graph(int num){
vertexList=new Vertex[num];
adjMat=new int[num][num];
for(int i=0;i<num;i++){
for(int j=0;j<num;j++){
adjMat[i][j]=0;
}
}
nVertex=0;
sCount=0;
}

public void insertVertex(char c){
vertexList[nVertex]=new Vertex(c);
nVertex++;
}

public void insertEdge(int s,int d){
adjMat[s-1][d-1]=1;
adjMat[d-1][s-1]=1;

}

public void showV(){
for(int i=0;i<nVertex;i++){
vertexList[i].showVertex();
}
}

public void showEdge(){
for(int i=0;i<nVertex;i++){
for(int j=i;j<nVertex;j++){
if(adjMat[i][j]==1){
char s=vertexList[i].getVertex();;
char d=vertexList[j].getVertex();
System.out.print(s+"<->"+d+" ");
}
}
}

}

public void DFS(){
Stack1 s=new Stack1(nVertex);

s.push(0);
vertexList[0].setVisited();
System.out.print(vertexList[0].getVertex());
while(!s.isEmpty()){
int v=s.getPeek();
int w=getAdjVertex(v);
if(w!=-1){
s.push(w);
vertexList[w].setVisited();
System.out.print(vertexList[w].getVertex());
}
else{
s.pop();

}




}

for(int i=0;i<nVertex;i++){
vertexList[i].rVisited();

}


}
public int getAdjVertex(int v){
for(int j=0;j<nVertex;j++){
if(adjMat[v][j]==1&&vertexList[j].wasVisited()==false){
vertexList[j].setVisited();
return j;
}
}
return -1;
}
class Queue{
private int[] qList;
private int rear;
private int front;
private int size;
public Queue(int n){
qList=new int[n];
size=0;
front=0;
rear=-1;
}
public void insert(int v){
rear++;
qList[rear]=v;
size++;

}
public void delete(){
front++;
size--;
}
public int getPeek(){
return qList[front];
}
public boolean isEmpty(){
return size==0;
}
public int size(){
return size;
}
}
public void bfs(){
System.out.println();
Queue q=new Queue(10);
q.insert(0);
vertexList[0].setVisited();

while(!q.isEmpty()){
int currentV=q.getPeek();
for(int i=0;i<nVertex;i++){
if(adjMat[currentV][i]==1&&vertexList[i].wasVisited()==false){
q.insert(i);
vertexList[i].setVisited();
}
}
// System.out.println(adjMat[currentV][1]);

//System.out.println(q.size());
vertexList[currentV].showVertex();
q.delete();
}

for(int i=0;i<nVertex;i++){
vertexList[i].rVisited();

}

}

class Stack1{
private int[] sArray;
private int size;
public Stack1(int s){
sArray=new int[s];
size=0;
}
public void push(int v){
sArray[size]=v;
size++;

}
public void pop(){
size--;
}
public boolean isEmpty(){
return size==0;
}
public int getPeek(){
return sArray[size-1];
}

}














}
public class GraphTest{
public static void main(String[] args){
Graph g=new Graph(5);
g.insertVertex('A');
g.insertVertex('B');
g.insertVertex('C');
g.insertVertex('D');
g.showV();

g.insertEdge(1,2);
g.insertEdge(1,3);
g.insertEdge(3,4);
g.showEdge();

g.DFS();
g.bfs();

}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值