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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求代码,java实验,题目如图相关的知识,希望对你有一定的参考价值。

题目描述:给定一个无向简单图G(未必是连通图),要求用深度优先搜索算法(DFS)对其结点进行遍历。输入:有多组测试数据。对于每一组测试数据,第一行是N M S,分别表示图G的结点数,边数,搜索的起点。后面是M行,每行输入图G的一条边,格式为“i j”,其中i,j为结点编号(范围是1~N)。其中1≤N≤100,0≤M≤100。当输入中的N=0时程序结束,0不作为输入样例。输出:对于每一个测试样例,输出搜索得到的结点序列。输出格式见样例输出。样例输入:8 9 11 21 32 42 53 64 85 86 77 36 5 21 21 32 43 26 50 0 0样例输出:Case 1:1 2 4 8 5 3 6 7Case 2:2 1 3 4 5 6提示:图的存储结构可以采用邻接矩阵或邻接表。



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);

追问

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

参考技术A 深度优先搜索?追问

深度广度都行

20165322 实验一 Java开发环境的熟悉

实验一 Java开发环境的熟悉

一、实验内容及步骤

(一)命令行下Java程序开发

  • 按照步骤新建目录、键入代码,再编译运行输出。运行结果和TREE结构图如下:

(二) IDEA下Java程序开发、调试

  • 建好HelloJDB.java后,键入代码并运行。

  • 鼠标左键点击在第10行设置断点,然后点右键在属性框里设置条件“i==50”:

  • 按F9运行:

二、练习

题目:实现求正整数1-N之间所有质数的功能,并进行测试(正常情况,异常情况,边界情况)。

  • 设计思路:

    质数计算在我们学过的计算中,常用,常常看比该数小的数的开根能否被该数整除。但是在此代码中我才采用了两个循环,两个整数相除余数为零的为合数。虽然效率不高,但这体现了编程的优越性。
  • 代码

    给在码云链接里:https://gitee.com/BESTI-IS-JAVA-2018/20165322wyj
  • 代码调试:

    • 一开始我的输出总是只有2、3两个质数,于是我进行了调试。
    • 我将断点设在第12行,按F7使它进入循环开始单步调试。然后发现flag在变化后不能归0,使后续质数无法判别输出。代码段如下
    System.out.println("1到"+ n +"中是质数的值有:");
         int flag = 0;
         for(int i=2;i<=n;i++){
             for(int j=2;j<i;j++) {
                 if (i % j == 0)
                     flag = 1;
             }
    
    只要把int flag放入第一个循环后即可。
  • 运行结果及测试

    • 正常测试:

    • 边界与异常测试:

三、实验收获

实验本身的算法是很简单的,也没有涉及到对象问题。但是我在运行出错的过程中开始学会调试代码,并且解决问题,感觉还是很不错的!同时测试也让我隐隐感觉到一个软件的开发,必须要全面的考虑到bug、漏洞问题,用户体验问题,在编程上更严谨。

以上是关于求代码,java实验,题目如图的主要内容,如果未能解决你的问题,请参考以下文章

数据结构荣誉课--第三次实验解题报告

数据结构荣誉课--第三次实验解题报告

数据结构荣誉课--第三次实验解题报告

数据结构荣誉课--第三次实验解题报告

JAVA实验报告一

20165322 实验一 Java开发环境的熟悉