1. 建立图的顶点
- package com.jzm.Graph;
- public class GraphNode {
- public GraphNode link;
- public int info;
- }
2. 建立图的前驱和后继点
- package com.jzm.Graph;
- public class GraphList {
- public GraphNode first;
- public GraphNode last;
- public boolean visitable;
- public int getAjd(int[] ajd) {
- GraphNode current = first;
- int length = 0;
- while(current != null) {
- ajd[length++] = current.info;
- current = current.link;
- }
- return length;
- }
- public void addNode(int v) {
- GraphNode node = new GraphNode();
- node.info = v;
- if(first == null) {
- first = node;
- last = node;
- } else {
- last.link = node;
- last = node;
- }
- }
- }
3. 写一个队列
- package com.jzm.Graph;
- public class Queue {
- public GraphNode first;
- public GraphNode last;
- public int count;
- public void addQueue(int info) {
- GraphNode node = new GraphNode();
- node.info = info;
- if(first == null) {
- first = node;
- last = node;
- } else {
- last.link = node;
- last = last.link;
- }
- count++;
- }
- public void deleteQueue() {
- if(first == null) {
- System.out.println("null queue");
- } else {
- first = first.link;
- count--;
- }
- }
- public boolean isEmpty() {
- return count == 0;
- }
- public int front() {
- if(first == null) {
- return -1;
- }
- return first.info;
- }
- public int back() {
- if(last == null) {
- return -1;
- }
- return last.info;
- }
- }
4. 建立图
- package com.jzm.Graph;
- public class Graph {
- private int length;
- private GraphList[] list;
- private int[][] weight;
- public Graph(int length) {
- this.length = length;
- list = new GraphList[length];
- weight = new int[length][length];
- }
- public void dfs(int v) {
- int[] ajd = new int[length];
- int ajdlength = list[v].getAjd(ajd);
- list[v].visitable = true;
- System.out.print(v + " ");
- for (int i = 0; i < ajdlength; i++) {
- int w = ajd[i];
- if (!list[w].visitable) {
- dfs(w);
- }
- }
- }
- // 深度优先遍历
- public void dfsTravel() {
- for (int i = 0; i < length; i++) {
- list[i].visitable = false;
- }
- for (int i = 0; i < length; i++) {
- if (!list[i].visitable) {
- dfs(i);
- }
- }
- }
- // 广度优先遍历
- public void bfsTravel() {
- for (int i = 0; i < length; i++) {
- list[i].visitable = false;
- }
- bfs();
- }
- private void bfs() {
- Queue queue = new Queue();
- for (int index = 0; index < length; index++) {
- if (!list[index].visitable) {
- queue.addQueue(index);
- list[index].visitable = true;
- System.out.print(index + " ");
- while (!queue.isEmpty()) {
- int temp = queue.front();
- queue.deleteQueue();
- int[] ajd = new int[length];
- int ajdlength = list[temp].getAjd(ajd);
- for (int i = 0; i < ajdlength; i++) {
- int w = ajd[i];
- if (!list[w].visitable) {
- System.out.print(w + " ");
- queue.addQueue(w);
- list[w].visitable = true;
- }
- }
- }
- }
- }
- }
- // 最短路径
- private int[] shortPath(int v) {
- int[] shortPath = new int[length];
- boolean[] weightFound = new boolean[length];
- for (int i = 0; i < length; i++) {
- // 趋近无穷
- shortPath[i] = 9999;
- weightFound[i] = false;
- }
- shortPath[v] = 0;
- weightFound[v] = true;
- Queue queue = new Queue();
- queue.addQueue(v);
- while (!queue.isEmpty()) {
- int temp = queue.front();
- queue.deleteQueue();
- int[] ajd = new int[length];
- int ajdlength = list[temp].getAjd(ajd);
- for (int i = 0; i < ajdlength; i++) {
- int w = ajd[i];
- if (!weightFound[w]) {
- if (shortPath[w] > shortPath[temp] + weight[temp][w]){
- shortPath[w] = shortPath[temp] + weight[temp][w];
- }
- }
- }
- int minWeightNode = 0;
- for (int i = 0; i < length; i++) {
- if (!weightFound[i]) {
- minWeightNode = i;
- for (int j = 0; j < length; j++) {
- if (!weightFound[j]) {
- if (shortPath[j] < shortPath[minWeightNode]) {
- minWeightNode = j;
- }
- }
- }
- break;
- }
- }
- if (!weightFound[minWeightNode]) {
- weightFound[minWeightNode] = true;
- queue.addQueue(minWeightNode);
- }
- }
- return shortPath;
- }
- // 长度
- public int length() {
- System.out.println("length="+length);
- return length;
- }
- public boolean isEmpty() {
- return length == 0;
- }
- // 添加节点
- public void addGraph(int info) {
- for (int i = 0; i < length; i++) {
- if (list[i] == null) {
- GraphList g = new GraphList();
- g.addNode(info);
- list[i] = g;
- break;
- }
- }
- }
- // 添加边
- public void addEdge(int vfrom, int vto, int value) {
- list[vfrom].addNode(vto);
- weight[vfrom][vto] = value;
- }
- // 打印图
- public void print() {
- for (int i = 0; i < length; i++) {
- GraphNode current = list[i].first;
- while (current != null) {
- System.out.print(current.info + " ");
- current = current.link;
- }
- System.out.println("");
- }
- }
- public static void main(String[] args) {
- Graph graph = new Graph(5);
- System.out.println("create graph start");
- for (int i = 0; i < 5; i++) {
- graph.addGraph(i);
- }
- graph.addEdge(0, 1, 16);
- graph.addEdge(0, 3, 2);
- graph.addEdge(0, 4, 3);
- graph.addEdge(3, 4, 7);
- graph.addEdge(3, 1, 12);
- graph.addEdge(4, 1, 10);
- graph.addEdge(4, 3, 5);
- graph.addEdge(4, 2, 4);
- graph.addEdge(2, 1, 3);
- graph.addEdge(1, 2, 5);
- graph.print();
- System.out.println("create graph end");
- int[] shortPath = graph.shortPath(0);
- for (int i = 0; i < shortPath.length; i++) {
- System.out.print(shortPath[i] + " ");
- }
- }
- }
http://blog.csdn.net/love_ubuntu/article/details/6689898
相关推荐
java版数据结构-树结构;java版数据结构-树结构;java版数据结构-树结构;java版数据结构-树结构;java版数据结构-树结构;java版数据结构-树结构;
全书内容浅显易懂,利用大量且丰富的图示与范例, 详解复杂的抽象理论,从最基本的数据结构概念开始 说明,再以Java工具加以诠释阵列结构、堆栈、链表 、队列、排序、查找等重要的概念,引领读者抓住重 点轻松进入...
非常不错哦,看了很有收获的,Java数据结构 -算法的效率
本学习资料包"java数据结构--学习"聚焦于如何在Java环境下理解和应用各种数据结构,旨在提升开发者的技术水平,使其能够编写出更加高效和优化的代码。 1. **数组**:数组是最基本的数据结构,用于存储同类型元素的...
### JAVA数据结构与基础知识详解 #### 一、Java与面向对象程序设计 Java是一种广泛使用的高级编程语言,其核心特点之一就是支持面向对象编程(OOP)。面向对象编程通过将数据和行为封装在对象中来简化软件开发和...
Java数据结构-->框架-->Java中间件,缓存JAVA核心知识点整理--》从Java基础-->Java数据结构-->框架-->Java中间件,缓存JAVA核心知识点整理--》从Java基础-->Java数据结构-->框架-->Java...
将一串字符串中的单词统计出现次数并排序-使用java常用数据结构
Hive是一款基于Hadoop的数据仓库工具,它可以将结构化的数据文件映射为一张数据库表,并提供SQL查询功能,适合处理和管理大规模数据。在Hive中,如果需要将数据存储在MySQL这样的关系型数据库中,或者从MySQL导入...
数据结构-基于Java的算法和数据结构源码.zip数据结构-基于Java的算法和数据结构源码.zip数据结构-基于Java的算法和数据结构源码.zip
Java作为广泛应用的编程语言,其在实现数据结构和算法时有着丰富的库支持和优秀的可读性。下面将对标题和描述中提到的一些关键知识点进行详细解释。 1. **数据结构**: - **稀疏数组**:当大量数据中大部分为零或...
数据结构-链表 JAVA语言实现,包含单向链表、双向链表、循环链表的遍历、删除和插入 详细介绍:http://blog.csdn.net/z740852294/article/details/77369439
它允许用户将大规模数据导入到Hadoop的HDFS,或者从Hadoop导出数据到结构化数据库。在与MySQL交互时,由于Hadoop生态系统主要由Java构建,因此需要一个JDBC驱动来连接MySQL。这就是`mysql-connector-java-5.1.10-bin...
java数据结构和算法--第二版
在IT领域,尤其是在编程世界,数据结构是至关重要的一个概念,尤其对于Java开发者而言。数据结构是组织、管理和存储数据的方式,它允许我们高效地访问和修改数据。本资源包"java---数据结构"显然是针对Java程序员...
IT各类面试题目,包括软件工程-数据结构-java-asp.net-网络
Java数据结构和算法 Java数据结构和算法 Java数据结构和算法 Java数据结构和算法 Java数据结构和算法 Java数据结构和算法 Java数据结构和算法 Java数据结构和算法
Java-GUI-可视化-数据结构-图的知识以及迪杰斯特拉算法 链接:...
8. **图(Graph)**:图是由节点和边组成的非线性数据结构,Java中通常通过邻接矩阵或邻接表来实现。 9. **堆(Heap)**:Java.util.PriorityQueue类实现了一个最小堆,可以用于优先级队列的操作。 10. **散列表...