java实现图的深度优先和广度优先

1.node的定义类

package Graph;

public class Node {
int data;
Node next;

Node(int data){ //初始化结点
this.data=data;
this.next=null;
}
}



2.图的构建和遍历


package Graph;

public class Graph {
private Node[]head; //存放每个结点的数据
int []visited; //表示每个结点的访问状态
private int Max_size=100; //初始化的队列的大小
int front=-1,rear=-1;
int queue[]=new int[Max_size];
public Graph(int n){ //构造函数,用来初始化head和visited
head=new Node[n];
visited=new int[n];
}


public void cerateGraph(int node[][],int num){
Node newnode=null;
Node ptr=null;
int start,end;
for(int j=1;j<=8;j++){
head[j]=new Node(j);
visited[j]=0;
}

for(int i=0;i<num;i++){
start=node[i][0]; //记录每条边的起点
end=node[i][1]; //记录边的终点
newnode=new Node(end);
ptr=head[start];
while(ptr.next!=null)
ptr=ptr.next; //找到以每个结点为起点的链表的最后一个结点
//将以start为起点的边插入到对应的head【start】尾部
ptr.next=newnode;
}
}

public void print(){ //打印图的邻接表 的表示
for(int i=1;i<=8;i++){
System.out.print(head[i].data);
Node ptr=head[i].next; //一定要用一个临时变量来操作,否则邻接表的值会被改变
while(ptr!=null){
System.out.print("-->"+ptr.data);
ptr=ptr.next;

}
System.out.println();
}
}

public void DFS(int current){ //深度优先
Node ptr;
visited[current]=1; //表示已经被访问
System.out.print(head[current].data+" ");
ptr=head[current].next;
while(ptr!=null){
if(visited[ptr.data]==0)
DFS(ptr.data); //递归实际上就是利用栈
ptr=ptr.next;
}
}
public void enqueue(int data){
rear++;
queue[rear]=data;
}

public int dequeue(){
front++;
return queue[front];
}

public void BFS(int current){
Node ptr;
for(int j=1;j<=8;j++){ //此处需要初始化,因为visited的状态已经被DFS改变
visited[j]=0;
}
enqueue(current); //将起点压入栈
visited[current]=1; //改变访问状态
System.out.print(current+" "); //输出这个结点
while(front!=rear){ //队列不为空时
current=dequeue();
ptr=head[current].next; //起点的下一个结点
while(ptr!=null){
if(visited[ptr.data]==0){ //如果没有被访问过,
enqueue(ptr.data); //进队列
visited[ptr.data]=1; //改变访问状态
System.out.print(ptr.data+" "); //输出这个结点
}
ptr=ptr.next; //访问下一个结点
}
}
}

}


3.测试类

package Graph;

import java.util.Scanner;

public class Test {
public static void main(String[] args) {
System.out.print("input the count of the virtex: ");
Scanner sc=new Scanner(System.in);
int N=sc.nextInt();
System.out.print("input the count of the edge: ");
int E=sc.nextInt();
System.out.println("input the information of edge: ");
int node[][]=new int[E][2];
for(int i=0;i<E;i++){
System.out.print("第"+(i+1)+" 边的起点和终点 :");
node[i][0]=sc.nextInt();
node[i][1]=sc.nextInt();
}
/*int node[][]={{1,2},{2,1},
{1,3},{3,1},
{2,4},{4,2},
{2,5},{5,2},
{3,6},{6,3},
{3,7},{7,3},
{4,8},{8,4},
{5,8},{8,5},
{6,8},{8,6},
{7,8},{8,7}

};*/
Graph g=new Graph(N+1); //N+1主要是为了表示的时候方便
g.cerateGraph(node, E);
System.out.println("邻接表表示的结果是:");
g.print();
System.out.print("\n深度优先遍历的结果是:");
g.DFS(1);
System.out.print("\n广度优先遍历的结果是:");
Graph gp=new Graph(N+1); //之所以要重新创建一个对象是因为DFS已经把visited的状态更新为自己的
gp.cerateGraph(node, E);
gp.BFS(1);
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
深度优先遍历和广度优先遍历是的两种常见遍历算法。 深度优先遍历(DFS)是一种递归算法,它从中的某个节点开始,首先访问该节点,然后遍历该节点的所有邻接节点,再依次对每个邻接节点进行深度优先遍历。换句话说,DFS会沿着的一条路径一直往下遍历,直到遇到没有未访问过的邻接节点为止,再返回上一级节点继续遍历其他未访问过的节点。DFS的实现一般使用递归或栈来保存待访问节点。 广度优先遍历(BFS)是一种队列的算法,它从中的某个节点开始,首先访问该节点,然后遍历该节点的所有邻接节点,并将这些邻接节点加入队列中。接下来从队列中取出一个节点,再依次遍历该节点的邻接节点,并将未访问过的邻接节点加入队列中,如此往复直到队列为空。BFS的实现一般使用队列来保存待访问节点。 在视频中,可以演示通过的邻接矩阵或邻接表的形式来表示,并使用Java代码来实现深度优先遍历和广度优先遍历。对于深度优先遍历,可以从中的某个节点开始递归地遍历它的邻接节点,并使用一个标记数组来记录节点是否已经访问过。对于广度优先遍历,可以使用一个队列来按照广度优先的顺序遍历中的节点,并同样使用标记数组来记录节点是否已经访问过。 通过这个视频,观众可以了解到深度优先遍历和广度优先遍历的原理和实现方法,并通过代码示例更好地理解其过程。这些算法在的遍历、路径查找等问题中应用广泛,对于理解和解决相关问题具有重要意义。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值