第四周作业——无向图的DFS算法

本文详细介绍了无向图的深度优先搜索(DFS)算法,通过实例代码展示了如何使用DFS遍历图,并输出节点遍历结果、前序和后序编号,以及计算连通分量的数量和组成。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2. 无向图的DFS算法:按照教材中的定义方式,完整实现图的DFS算法,给定图数据文件(tinyG.txt),能够输出DFS的节点遍历结果,及每个节点的Pre和Post值,和连通分量的个数与节点构成。类名:GraphDFS博文标题:第四周作业——无向图的DFS算法




package com.zuoye;

import java.io.File;
import java.util.Queue;
import java.util.Scanner;

public class GraphDFS {

	/**
	 * 无向图的DFS算法 (陈楚东)
	 */
	private int vNum;
	private int arcNum;
	private int counter=1;
	private int arc[][];
	private int pre[],post[];
	boolean[] visited;
 	public GraphDFS(int vNum,int arcNum){
		this.vNum=vNum;
		this.arcNum=arcNum;
		this.arc=new int[vNum][arcNum];
		visited=new boolean[vNum];
		pre=new int[vNum];
		post=new int[vNum];
	}
	public int[][] getArc(){
		return arc;
	}
	public void addEdage(int v1,int v2){
		arc[v1][v2]=1;
		arc[v2][v1]=1;
	}
	public static void main(String[] args) {
		String path="src/tinyG.txt";
		try{
			Scanner scanner=new Scanner(new File(path));
			int vNum= scanner.nextInt();
			int arcNum=scanner.nextInt();
			GraphDFS g=new GraphDFS(vNum, arcNum);
			
			for(int i=0;i<arcNum;i++){
				int v1=scanner.nextInt();
				int v2=scanner.nextInt();
				g.addEdage(v1, v2);
			} 
			g.DFSTraverse();
			for(int i=0;i<vNum;i++){
				System.out.println("顶点:"+i+" pre:"+g.pre(i)+",post:"+g.post(i));
			}
		}catch (Exception e) {
			e.printStackTrace();
		}
	}
	/**
	 * 初始化每个未被访问的节点
	 */
	public void DFSTraverse(){
		for(int i=0;i<vNum;i++){
			visited[i]=false;
		}
		System.out.println("深度优先遍历的结果是:");
		int j=1;//第几个连通分量的序号
		for(int i=0;i<vNum;i++){//选取某个特定的点开始深度优先搜索
			if(!visited[i]){
				System.out.println("第"+(j++)+"个连通分量:");
				dfs(i);
				System.out.println();
			}
		}
	}
	public int pre(int v){
		 return pre[v];
	}
	public int post(int v){
		return post[v]; 
	}
	public void dfs(int i){
		visited[i]=true;
		System.out.print(i+" ");
		pre[i]=counter++;
		for(int j=0;j<vNum;j++){
			if(arc[i][j]==1&&!visited[j]){
				dfs(j);
			}
		}
		post[i]=counter++;
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值