问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

求代码,java实验,题目如图

发布网友 发布时间:2022-04-25 20:50

我来回答

2个回答

热心网友 时间:2022-06-17 07:11



import java.util.Scanner;
import java.util.Stack;

public class DFS
{
// 存储节点信息
private char[] vertices;

// 存储边信息(邻接矩阵)
private int[][] arcs;

// 图的节点数
private int vexnum;

// 记录节点是否已被遍历
private boolean[] visited;

// 初始化
public DFS(int n)
{
vexnum = n;
vertices = new char[n];
arcs = new int[n][n];
visited = new boolean[n];
for(int i = 0; i < vexnum; i++)
{
for(int j = 0; j < vexnum; j++)
{
arcs[i][j] = 0;
}
}
}

// 添加边(无向图)
public void addEdge(int i, int j)
{
// 边的头尾不能为同一节点
if(i == j)
return;
arcs[i - 1][j - 1] = 1;
arcs[j - 1][i - 1] = 1;
}

// 设置节点集
public void setVertices(char[] vertices)
{
this.vertices = vertices;
}

// 设置节点访问标记
public void setVisited(boolean[] visited)
{
this.visited = visited;
}

// 打印遍历节点
public void visit(int i)
{
System.out.print(vertices[i] + " ");
}

// 从第i个节点开始深度优先遍历
private void traverse(int i)
{
// 标记第i个节点已遍历
visited[i] = true;
// 打印当前遍历的节点
visit(i);
// 遍历邻接矩阵中第i个节点的直接联通关系
for(int j = 0; j < vexnum; j++)
{
// 目标节点与当前节点直接联通,并且该节点还没有被访问,递归
if(arcs[i][j] == 1 && visited[j] == false)
{
traverse(j);
}
}
}

// 图的深度优先遍历(递归)
public void DFSTraverse(int start)
{
// 初始化节点遍历标记
for(int i = 0; i < vexnum; i++)
{
visited[i] = false;
}
// 从没有被遍历的节点开始深度遍历
for(int i = start - 1; i < vexnum; i++)
{
if(visited[i] == false)
{
// 若是连通图,只会执行一次
traverse(i);
}
}
}

// 图的深度优先遍历(非递归)
public void DFSTraverse2(int start)
{
// 初始化节点遍历标记
for(int i = 0; i < vexnum; i++)
{
visited[i] = false;
}
Stack<Integer> s = new Stack<Integer>();
for(int i = start - 1; i < vexnum; i++)
{
if(!visited[i])
{
// 连通子图起始节点
s.add(i);
do
{
// 出栈
int curr = s.pop();
// 如果该节点还没有被遍历,则遍历该节点并将子节点入栈
if(visited[curr] == false)
{
// 遍历并打印
visit(curr);
visited[curr] = true;
// 没遍历的子节点入栈
for(int j = vexnum - 1; j >= 0; j--)
{
if(arcs[curr][j] == 1 && visited[j] == false)
{
s.add(j);
}
}
}
} while(!s.isEmpty());
}
}
}

public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
int N, M, S;
while(true)
{
System.out.println("输入N M S,分别表示图G的结点数,边数,搜索的起点:");
String line = sc.nextLine();
if(!line.matches("^\\s*([1-9]\\d?|100)(\\s+([1-9]\\d?|100)){2}\\s*$"))
{
System.out.print("输入错误,");
continue;
}
String[] arr = line.trim().split("\\s+");
N = Integer.parseInt(arr[0]);
M = Integer.parseInt(arr[1]);
S = Integer.parseInt(arr[2]);
break;
}
DFS g = new DFS(N);
char[] vertices = new char[N];
for(int i = 0; i < N; i++)
{
vertices[i] = (i + 1 + "").charAt(0);
}
g.setVertices(vertices);
for(int m = 0; m < M; m++)
{
System.out.println("输入图G的第" + (m + 1) + "条边,格式为“i j”,其中i,j为结点编号(范围是1~N)");
String line = sc.nextLine();
if(!line.matches("^\\s*([1-9]\\d?|100)\\s+([1-9]\\d?|100)\\s*$"))
{
System.out.print("输入错误,");
m--;
continue;
}
String[] arr = line.trim().split("\\s+");
int i = Integer.parseInt(arr[0]);
int j = Integer.parseInt(arr[1]);
g.addEdge(i, j);
}
sc.close();
System.out.print("深度优先遍历(递归):");
g.DFSTraverse(S);
System.out.println();
System.out.print("深度优先遍历(非递归):");
g.DFSTraverse2(S);
}
}

追问问一下,如果把无向简单图换成有向简单图还怎么写

热心网友 时间:2022-06-17 07:11

深度优先搜索?追问深度广度都行

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
你好医生我想问下有时过了性生活后老想上厕所又大小便... 电脑开机按f1怎么开机台式电脑开机需要按F1怎么处理 三者30万标准保费 30万左右的车保险多少钱 30万的车 保险 奥数中的余数问题 石家庄市裕华区小岗上新村前不久传出有传销窝点消息可靠吗? 2019公安部曝光77种涉嫌传销项目 2019年传销诈骗项目名单一览 娱乐圈又曝性骚扰,我想说出她的故事 河北省承德市丰宁县的那一带农村7月底是农忙的时间吗?急~~~ 单位招录了10名新员工,按其应聘成绩排名1到10,并用10个连续的四位自然... 用java编写 深度优先法 寻路时 怎么实现八个方向的路径选择 在线等,计算机高手,java深度搜索树代码 java 深度优先搜索(回溯法)求集合的幂集 java如何实现 深度优先 广度优先 迅雷已下载文件删除后怎么恢复!急! 立即恢复下载的文件 迅雷误删了已完成下载的文件,请问如何恢复 手机查看文件,却显示下载失败请恢复下载是什么意思 误删迅雷正在下载文件,如何恢复下载 如何恢复下载管理被删的文件 灰枣好吗? ug如何设置为多窗口??? UG界面设置 干灰枣有哪些功效与作用? UG10整个操作界面放大如何缩回 UG10制图中特征控制框怎么竖立放 UG10怎么设置固定这个页面?下次开启进来就不用调? UG打开超过10个图以后,工具栏里的“窗口”最多只能显示10个可以切换的图档。怎么设置多一点呢 UG安装后工具栏的每个功能框都很大,怎么能让他变成小图标? UG学习怎么把适合窗口建在工具栏栏里? 急求大佬帮忙写一下java程序 用java实现野人传教士过河问题 如何深度优先遍历二叉树 java (急)编写一个java工程,随机自动生成一个迷宫,并分别运用广度优先和深度优先算出入口到出口的路径 深度优先和广度优先 的区别 ,用法。 谁能给我一个 java算法题的解题思路!!! java解析xml的几种方式哪种最好 哪位仁兄有JAVA实现的多叉树源码 在java中解析xml有哪几种方法 java面试题 很急 谢谢 java解析xml的几种方式哪种最好? java穷举搜索法,谁来写个! 文言文 与诸弟书 信佛,信因果,在真正的因果面前,人的力量是微不足道的是什么意思 菜根谭中的五则名句 与诸弟书 如果你创业,你觉得有哪些方面是需要外界的帮助? 性格特点对创业有什么帮助? 我想创业能有什么帮助? 你认为大学生创业对以后有哪些帮助?