图G由两个集合V和E组成,记为:G=(V,E),其中:V是顶点的有穷非空集合,E是V中顶点偶对(称为边)的有穷集。通常,也将图G的顶点集和边集分别记为V(G)和E(G)。E(G)可以是空集。若E(G)为空,则图G只有顶点而没有边。图有两种存储结构:邻接矩阵和邻接表。邻接矩阵:用邻接矩阵表示顶点间的相邻关系, 用一个顺序表来存储顶点信息。邻接表:类似于树的孩子链表表示法。对于图G中的每个顶点vi,该方法把所有邻接于vi的顶点vj链成一个带头结点的单链表,这个单链表就称为顶点vi的邻接表(Adjacency
List)。
下面是用邻接矩阵存储的图。
package cn.zhf.test;
public class Graph {
final int MAX_VERTEX = 10;// 最多20个顶点
Vertex[] vertex;// 顶点数组
int[][] adjacency;// 邻接矩阵
int numOfVertex;// 当前图中顶点的数量
public Graph() {// 构造器
vertex = new Vertex[MAX_VERTEX];
adjacency = new int[MAX_VERTEX][MAX_VERTEX];
numOfVertex = 0;
// 将邻接矩阵初始化
for (int i = 0; i < MAX_VERTEX; i++) {
for (int j = 0; j < MAX_VERTEX; j++)
adjacency[i][j] = 0;
}
}
// 添加顶点
public void addVertex(char v) {
vertex[numOfVertex++] = new Vertex(v);
}
//无向图 添加边
public void addEdge(int start, int end) {
adjacency[start][end] = 1;
adjacency[end][start] = 1;
}
//有向图添加边
public void addEdge1(int start,int end){
adjacency[start][end] = -1;
}
// 打印某个顶点
public void showVertex(int index) {
System.err.print(vertex[index].label);
}
// 打印邻接矩阵
public void show() {
for (int i = 0; i < MAX_VERTEX; i++) {
for (int j = 0; j < MAX_VERTEX; j++) {
if (j == MAX_VERTEX - 1)
System.out.println(adjacency[i][j] + " ");
else
System.out.print(adjacency[i][j] + " ");
}
}
}
/**
* 找到与某一顶点邻接而未被访问的顶点,如何做?
* 在邻接矩阵中,找到指定顶点所在的行,从第一列开始向后寻找值为1的列,列号是邻接顶点的号码,检查此顶点是否访问过。
* 如果该行没有值为1而又未访问过的点,则此顶点的邻接点都访问过了。
*/
public int getUnVisitedVertex(int index) {
for (int i = 0; i < numOfVertex; i++)
if (adjacency[index][i] == 1 && vertex[i].wasVisited == false)
return i;
return -1;
}
// 图的深度优先遍历
public void dfs() {
vertex[0].wasVisited = true;// 从头开始访问
showVertex(0);
Stack stack = new Stack();
stack.push(0);
/**
* 1.用peek()方法获取栈顶的顶点 2.试图找到这个顶点的未访问过的邻接点 3.如果没有找到这样的顶点,出栈 4.如果找到,访问之,入栈
*/
while (!stack.isEmpty()) {
int index = getUnVisitedVertex(stack.peek());
if (index == -1)// 没有这个顶点
stack.pop();
else {
vertex[index].wasVisited = true;
showVertex(index);
stack.push(index);
}
}
// 栈为空,遍历结束,标记位重新初始化
for (int i = 0; i < numOfVertex; i++)
vertex[i].wasVisited = false;
}
// 图的广度优先遍历
public void bfs() {
vertex[0].wasVisited = true;
showVertex(0);
Queue queue = new Queue();
queue.insert(0);
int v2;
while (!queue.isEmpty()) {// 直到队列为空
int v1 = queue.remove();
// 直到点v1没有未访问过的邻接点
while ((v2 = getUnVisitedVertex(v1)) != -1) {
// 取到未访问过的点,访问之
vertex[v2].wasVisited = true;
showVertex(v2);
queue.insert(v2);
}
}
for (int i = 0; i < numOfVertex; i++)
vertex[i].wasVisited = false;
}
// 最小生成树 minimum spanning tree
public void mst() {
vertex[0].wasVisited = true;
Stack stack = new Stack();
stack.push(0);
while (!stack.isEmpty()) {
int currentVertex = stack.peek();
int v = getUnVisitedVertex(currentVertex);
if (v == -1)
stack.pop();
else {
vertex[v].wasVisited = true;
stack.push(v);
//当前顶点与下一个未访问过的邻接点
showVertex(currentVertex);
showVertex(v);
System.out.print(" ");
}
}
for (int i = 0; i < numOfVertex; i++)
vertex[i].wasVisited = false;
}
public static void main(String[] args) {
Graph graph = new Graph();
graph.addVertex('A');
graph.addVertex('B');
graph.addVertex('C');
graph.addVertex('D');
graph.addEdge(1, 2);
graph.addEdge(0, 1);
graph.addEdge(2, 3);
graph.show();
// graph.dfs();
// graph.bfs();
graph.mst();
}
}
// 顶点
class Vertex {
char label;// 如A,B,C
boolean wasVisited;// 标识是否访问过此顶点
public Vertex(char vertex) {
this.label = vertex;
wasVisited = false;
}
}
// 栈
class Stack {
final int MAX_SIZE = 10;
int stack[];
int top;
public Stack() {
stack = new int[MAX_SIZE];
top = -1;
}
public void push(int idata) {
stack[++top] = idata;
}
public int pop() {
return stack[top--];
}
public int peek() {
return stack[top];
}
public boolean isEmpty() {
return top == -1;
}
}
// 队列
class Queue {
final int SIZE = 10;
int[] qarray;
int front;
int rear;
public Queue() {
qarray = new int[SIZE];
front = 0;
rear = -1;
}
// 在队尾追加
public void insert(int key) {
if (rear == SIZE - 1)
rear = -1;
qarray[++rear] = key;
}
// 队头删除数据
public int remove() {
int temp = qarray[front++];
if (front == SIZE)
front = 0;
return temp;
}
public boolean isEmpty() {
return rear + 1 == front || front + SIZE - 1 == rear;
}
}
分享到:
相关推荐
全国交通咨询系统(数据结构课设 图的应用 java实现 内含课设报告)全国交通咨询系统(数据结构课设 图的应用 java实现 内含课设报告)全国交通咨询系统(数据结构课设 图的应用 java实现 内含课设报告)全国交通...
JAVA实现链表 有序二叉树 队列的代码例子
找到了当初存的Java实现的数据结构ppt一份,分享给大家~!
数据结构-链表 JAVA语言实现,包含单向链表、双向链表、循环链表的遍历、删除和插入 详细介绍:http://blog.csdn.net/z740852294/article/details/77369439
《计算机科学丛书·数据结构从应用到实现(Java版)》系统地介绍了数据结构以及数据结构与对象之间的联系。主要内容包括:算法效率的输入规模、阶和大O,数据结构的无序和有序列表,队列和栈基于数组和链表的设计实例...
是用java语言实现的一些数据结构,众所周知,数据结构一直都是学习计算机专业的一门重要课程,它的难度和重要性可想而知,同时学好数据结构对自身也有很打的提高,大部分书的数据结构是都用C语言或是C++语言实现的,...
本书的目的是从抽象思维和问题求解的观点提供对数据结构的实用介绍,试图包含有关数据结构、算法分析及其Java实现的所有重要的细节。作者采用了独特的方法将数据结构分成说明和实现两部分,并充分利用了已有的数据...
常见数据结构的Java实现 例子1 import java.util.*; public class Example13_1 { public static void main(String args[]) { List list=new LinkedList(); list.add("is"); list.add("a"); int number=list....
数据结构(Java)实践作业迷宫参考书本使用栈结构实现的
通过java实现数据结构的一些内容,里面有一些测试,不过没有完全按照书上代码实现,但是值得参考。(jdk1.7+junit 4 编码:utf8)
包含链表、 栈、 队列、优先级队列、哈希表,绝对原创总结!
队列实现,数据结构作业练习参考,Java实现,环境eclipes1.8
java 数据结构实现 java 数据结构实现 java 数据结构实现 java 数据结构实现
数据结构 单链表 java 图形界面实现
用Java实现数据结构中的队列 用Java实现数据结构中的队列
java实现版数据结构与算法视频教程,感兴趣的可以看看。
该资源包含使用Java实现的绝大部分基础算法和数据结构,包含视频教程,使得算法学习更加容易,该资源从网络收集回来,仅供学习使用
数据结构 用Java语言实现矩阵 可视代码数据结构 用Java语言实现矩阵 可视代码数据结构 用Java语言实现矩阵 可视代码数据结构 用Java语言实现矩阵 可视代码
数据结构经典算法Java完美实现 是学习JAVA数据结构的经典代码
详解了一些经典算法和数据结构,希望对大家有帮助,鄙人能力有限,代码出错的地方请大家多多指正