/*class Queue {
private int[] values;
private int begin = -1;
private int end = -1;
Queue(int size) {
values = new int[size];
}
void push(int value) {values[++begin] = value;}
int pop() { return values[++end]; }
boolean isEmpty() { return begin == end; }
}*/
class Vertex {
private Object value;
private boolean isVisited;
private int weight;
Vertex(Object value) {
this.value = value;
}
void visit() { isVisited = true; print(); }
//void clean() { isVisited = false; }
boolean isVisited() { return isVisited; }
void print() { System.out.print(value+"→"); }
}
public class Graph {
private Vertex[] vertexs;
private int[][] adjMat;
private int pos = -1;
int sum=0;
int last=0;
Graph(int size) {
vertexs = new Vertex[size];
adjMat = new int[size][size];
}
void add(Object value) {
//assert pos < vertexs.length;
vertexs[++pos] = new Vertex(value);
adjMat[pos][pos]=10000;
}
void connect(int from, int to,int weight) {
adjMat[from][to] = weight;
adjMat[to][from] = weight;
}
/*void disConnect(int from, int to) {
adjMat[from][to] = 0;
adjMat[to][from] = 0;
}*/
int findNeighbor(int index) {
int min=10000,i,j=0;
for( i=0; i<=pos;i++ )
if(!(vertexs[i].isVisited()))
if(adjMat[index][i]<min){
min=adjMat[index][i];
j=i;
}
return j;
}
/* void bfs(int index) { //从指定下标的节点开始广度优先遍历
if(vertexs[index] == null) return; //如果图中没有指定下标节点,则退出
Queue q=new Queue(vertexs.length); //创建队列存放访问过的节点
vertexs[index].visit(); //访问指定节点
q.push(index); //将节点推入队列中
while(!q.isEmpty()) { //队列为空则表示遍历结束
index = q.pop(); //取出队头
int i;
while(((i=findNeighbor(index)) != -1)&&(!(vertexs[i].isVisited()))) { //寻找头节点的所有邻接节点
vertexs[i].visit(); //标记访问过的邻接节点
q.push(i); //放入队列中
}
}
}*/
/* void routsum(Graph g,int index){
int i, sum=0;
for()
while(((i=findNeighbor(index)) != -1)&&(!(vertexs[i].isVisited()))){
sum+=g.adjMat[index][i];
}
System.out.println(sum);
}*/
void dfs(Graph g,int index){ //从指定下标的节点开始深度优先遍历
vertexs[index].visit();
int i=0 ;
while(((i=findNeighbor(index)) != -1)&&(!(vertexs[i].isVisited()))){
sum += g.adjMat[index][i];
dfs(g,i);
if(findNeighbor(i)==index)last=i;
i=findNeighbor(i);
}
}
//void clean() { for(Vertex v: vertexs) if(v != null)v.clean(); }
public static void main(String[] args) {
Graph g = new Graph(20);
g.add('a');
//System.out.println(g.adjMat[0][0]);
g.add('b');
g.add('c');
g.add('d');
g.add('e');
g.connect(0, 1, 4);
g.connect(0, 2, 6);
g.connect(0, 3, 7);
g.connect(0, 4, 16);
g.connect(1, 2, 3);
g.connect(1, 3, 4);
g.connect(1, 4, 19);
g.connect(2, 3, 11);
g.connect(2, 4, 10);
g.connect(3, 4, 3);
g.dfs(g,0);
g.vertexs[0].visit();
System.out.print("所走路程共:"+(g.sum+g.adjMat[0][g.last])+"单位");
//System.out.print(g.adjMat[0][g.last]);
}
}
分享到:
相关推荐
在计算机科学中,数据结构是组织、管理和存储数据的方式,它是算法的基础。本文将深入探讨图这一重要...通过`Tu.java`这个文件,我们可以学习如何用Java实现图的深度遍历,这对于理解和处理复杂的网络结构至关重要。
pdf文档的内容都是坐标定位的,文档内容主要包含文本、图片、线条;需要用到pdfbox和pdf2dom两个依赖包
Java中图可以使用邻接矩阵或邻接表实现。 **应用场景**: - 社交网络 - 路径规划 ### 算法分析 #### 排序算法 排序算法用于对数据集进行排序,常见的有冒泡排序、选择排序、插入排序、快速排序等。 - **冒泡...
在Java编程语言中,我们可以利用其丰富的数据结构库来构建这样的模型。 内存中图表示模型的核心是节点(Vertex)和边(Edge)。节点代表图中的实体,而边则表示节点之间的关系。在Java中,可以使用类来表示节点和边...
7、在Guava的基础上实现《数据结构》中的关键路径、最短路径、最小生成树、图的遍历等算法 8、进阶java8中的函数式编程(Lambda表达式) 9、学习ForkJoinPool并发编程方式 10、学习Android中的StateMachine的层次...
实验可能涉及到数组的初始化、遍历以及基于数组的简单算法实现。 - 链表则弥补了数组的不足,它允许动态增删元素,但访问速度相对较慢。链表分为单链表、双链表和环形链表等,实验中可能会设计相关的操作如插入、...
LeetCode中的树题涵盖了遍历、搜索、构造等多个方面,Java中可以通过递归或迭代方式处理。 4. 图:虽然在LeetCode中图题目相对较少,但依然有一些涉及到图的题目,如最短路径问题。Java中可以使用邻接矩阵或邻接表...
虽然LeetCode中图问题较少,但仍然需要理解图的基本概念,如深度优先搜索(DFS)和广度优先搜索(BFS)。 在解决LeetCode问题时,Java提供了一些强大的工具和库。例如,`java.util.ArrayList`和`java.util....
在图数据结构中,有许多常见的操作和算法,如深度优先搜索(DFS)和广度优先搜索(BFS)用于遍历或搜索图中的所有顶点。DFS通过沿着边尽可能深地探索图的分支,而BFS则从起始顶点开始,逐层探索邻居节点。这两种算法...
这通常需要编程实现,例如使用C++或Java等语言,通过动态内存分配创建节点,并根据用户输入或预设数据来构建边的连接。 图的输入是获取用户数据或者读取文件中图的信息,以便于在程序中构建图的结构。田松同学负责...
压缩包中的“数据结构中图的各种算法的(实现可以运行)”文件,很可能是包含这些算法的源代码实现,如C++、Python或Java等编程语言。这些实现可以帮助我们更好地理解和应用这些算法,通过实际运行和调试,加深对图...
算法设计技巧与分析》中图3.9左侧的树,可以插入数值并打印结果。 总结来说,二叉搜索树是一种强大的数据结构,它利用特定的结构特性实现了高效的搜索和排序。通过JavaScript实现的二叉搜索树类,我们可以方便地...
- `1_120.jpg`, `1_48.jpg`, `1_24.jpg`:这些可能是经过处理后的头像图片,数字可能代表不同的尺寸,比如120x120像素、48x48像素、24x24像素,用于适应不同显示场景的需求,如大图、中图和小图。 - `index.php`:...
5. **图**:虽然在 LeetCode 中图的题目相对较少,但依然涵盖了一些经典问题,如最短路径、最小生成树等。 6. **排序和搜索**:包括快速排序、归并排序、二分查找等算法,如实现快速排序、寻找旋转排序数组中的...
本工程包含了SpringAOP,死锁,JUC同步锁,读-写同步锁,线程本地使用,JUC线程池和Spring提供的线程池,jdk 1.8中的日期时间API,数据结构中图的实现及操作和广度优先遍历/深度优先遍历(其他待完善),生成XML文件...
• 6.8.htm 数组元素遍历之二 • 6.9.htm 用构造函数来创建数组 • 6.10.htm 用构造函数来创建数组之二 • 6.11.htm join方法 • 6.12.htm revrse方法 • 6.13....
LeetCode的题库覆盖了多种编程语言,如Java、Python、C++等,题目类型多样,包括但不限于数组、链表、字符串、栈、队列、二叉树、图、哈希表、回溯、动态规划等。这些题目不仅能够帮助程序员巩固基础,还能挑战高级...