`
若是人间
  • 浏览: 76291 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java 图的拓扑排序(利用Vector存储)

阅读更多

Stack类:

package com.javaeye.rsrt;

/**
 * 栈,遵循先进后出的原则,用来保存元素
 * 
 * @author nishiting
 * 
 */
public class Stack {

	private int[] st;
	private int top;
	private int count;

	/**
	 * 构造一个栈
	 * 
	 * @param size
	 *            栈的大小
	 */
	public Stack(int size) {
		st = new int[size];
		top = -1;
		count = 0;
	}

	/**
	 * 元素进栈
	 * 
	 * @param j
	 *            要进栈的元素
	 */

	public void push(int j) {
		count++;
		st[++top] = j;
	}

	/**
	 * 元素出栈
	 * 
	 * @return 出栈的元素
	 */

	public int pop() {

		return st[top--];
	}

	/**
	 * 查询栈顶元素
	 * 
	 * @return 栈顶元素
	 */

	public int peek() {
		return st[top];
	}

	/**
	 * 查询栈是否为空
	 * 
	 * @return 栈是否为空
	 */

	public boolean isEmpty() {
		count--;
		return (top == -1);
	}

	/**
	 * 查看栈里的所有元素
	 */

	public void list() {

		for (int i = 0; i < count; i++) {

			System.out.print(st[i] + "   ");

		}
		System.out.println();
	}

	/**
	 * 得到栈里一共有多少元素
	 * 
	 * @return 栈里的元素个数
	 */
	public int getCount() {
		return count;
	}

	/**
	 * 查看栈里是否包含某个元素
	 * 
	 * @param i
	 *            要查询的元素
	 * @return 是否包含了要查询的元素
	 */

	public boolean isContains(int i) {
		for (int k = 0; k < st.length; k++) {

			System.out.print("开始比较" + i + "此时的result:");
			list();
			System.out.println();
			if (st[k] == i) {
				return true;
			}
		}
		return false;
	}
	
	/**
	 * 得到栈里的元素集
	 * @return 栈里的元素集合
	 */
	public int[] getSt(){
		return st;
	}

}

 Graph类:

package com.javaeye.rsrt;

import java.util.Arrays;
import java.util.List;
import java.util.Vector;

/**
 * 
 * @author nishiting
 * 
 */

public class Graph {

	int vertexNum;
	Vector[] vector;
	Stack stack;
	int[] result;
	int[] in;// 入度

	/**
	 * 
	 * 构造一个图
	 * 
	 * @param num
	 *            图的顶点数
	 * 
	 */
	public Graph(int num) {

		vertexNum = num;
		vector = new Vector[vertexNum];
		stack = new Stack(num);
		result = new int[vertexNum];
		in = new int[vertexNum];

	}

	/**
	 * 向图中添加无向边
	 * 
	 * @param I
	 *            边的一个顶点
	 * @param J
	 *            边的另一个顶点
	 * @return 是否添加成功
	 */
	public boolean addEdge(int I, int J) {

		/**
		 * 判断用户输入的是否是一个顶点,如果是,则返回flase,添加不成功
		 */
		if (J == I) {
			return false;
		}

		/**
		 * 判断所输入的顶点值是否在图所顶点范围值内,如果不在,则提示顶点不存在
		 * 
		 */
		if (I < vertexNum && J < vertexNum && I >= 0 && J >= 0) {

			/**
			 * 
			 * 判断边是否存在
			 */

			if (isEdgeExists(I, J)) {

				return false;
			}

			/**
			 * 添加边,将孤头的入度加1
			 */

			vector[I].add(J);
			in[J]++;
			return true;
		}
		return false;
	}

	/**
	 * 判断有向边是否存在
	 * 
	 * @param i
	 *            要查询的有向边的一个孤尾
	 * @param j
	 *            要查询的有向边的另一个孤头
	 * @return 边是否存在,false:不存在,true:存在
	 */

	public boolean isEdgeExists(int i, int j) {

		/**
		 * 判断所输入的顶点值是否在图所顶点范围值内,如果不在,则提示顶点不存在
		 * 
		 */
		if (i < vertexNum && j < vertexNum && i >= 0 && j >= 0) {

			if (i == j) {
				return false;
			}

			/**
			 * 判断i的邻接结点集是否为空
			 */

			if (vector[i] == null) {
				vector[i] = new Vector(8);
			}

			/**
			 * 判断这条边是否存在,如果存在,则提示边已经存在
			 */
			for (int q = 0; q < vector[i].size(); q++) {

				if (((Integer) vector[i].get(q)).intValue() == j) {
					System.out.println("顶点" + i + "和" + "顶点" + j + "这两点之间存在边");
					return true;

				}
			}
		}
		return false;
	}

	public void TopSort() {

		for (int i = 0; i < vertexNum; i++)
			if (in[i] == 0)
				stack.push(i);
		int k = 0;
		while (!stack.isEmpty()) {

			result[k] = (Integer) stack.pop();

			if (vector[result[k]] != null) {
				for (int j = 0; j < vector[result[k]].size(); j++) {

					int temp = (Integer) vector[result[k]].get(j);
					if (--in[temp] == 0) {
						stack.push(temp);
					}

				}

			}
			k++;

		}

		if (k < vertexNum) {
			System.out.println("有回路");
			System.exit(0);

		}

	}

	public int[] getResult() {
		return result;

	}

}

 测试类:

package com.javaeye.rsrt;

import java.util.List;

import junit.framework.TestCase;

public class GraphTest extends TestCase {

	public void testGraph(){
		Graph graph = new Graph(6);
		graph.addEdge(1, 0);
		graph.addEdge(2, 0);
		graph.addEdge(3, 0);
		graph.addEdge(1, 3);
		graph.addEdge(2, 3);
		graph.addEdge(3, 5);
		graph.addEdge(4, 2);
		graph.addEdge(4, 3);
		graph.addEdge(4, 5);
		
		graph.TopSort();
		int[] list = graph.getResult();
		System.out.println("拓扑排序的结果为:");
		for(int i : list){
			
			System.out.print(i+"        ");
		}
	}
	
}
1
1
分享到:
评论

相关推荐

    【数据结构】基于紧缩图的邻接表的拓扑排序正文终稿.doc

    图用于存储节点和边的信息,栈用于辅助进行拓扑排序。 - 函数原型设计:定义创建图、添加边、拓扑排序等核心函数。 - 主算法设计:采用深度优先搜索(DFS)或广度优先搜索(BFS)实现拓扑排序。在紧缩图的邻接表中...

    Java版 数据结构与算法

    3. **图算法**:如Dijkstra算法(求最短路径)、Floyd算法(所有顶点间最短路径)、拓扑排序等。 4. **动态规划**:解决最优化问题的一种方法,如背包问题、最长公共子序列等。 5. **回溯法**:用于解决组合问题,...

    java数据结构经典例题

    图可以用于解决很多复杂问题,如最短路径、拓扑排序等。Java没有内置的图数据结构,但可以通过自定义类实现。 9. **排序和搜索算法**:包括冒泡排序、选择排序、插入排序、快速排序、归并排序、二分查找等,这些都...

    LeetCode Java Algorithm 记录数据结构与算法训练题,分享java面试题.zip

    - **图论算法**:最短路径算法(Dijkstra、Bellman-Ford、Floyd-Warshall),最小生成树(Prim、Kruskal),拓扑排序等。 - **数学算法**:质因数分解、模逆运算、快速幂、组合数学、线性代数等。 - **递归与分治...

    华为2019网络精英挑战赛初赛模拟题-基础开发Java方向.docx

    - **前提条件**:对于不含回路的有向图,一定存在至少一种拓扑排序顺序。 ### 路由优先级 - **决定因素**:路由优先级主要由路由协议本身的算法优劣决定。 ### JVM垃圾回收 - **控制机制**:虽然程序员无法直接...

    wsn.rar_WSN_wsn 仿真 java_无线传感器_路由 传感器

    在Java环境下进行WSN的仿真,可以利用其跨平台的特性以及丰富的类库来构建复杂的网络模型。在这个项目中,开发者可能使用了Java的网络编程API,如Socket和MulticastSocket,来模拟节点间的通信,以及线程管理API来...

    Java编程语言中的数据结构与算法:深入理解与实践指南.zip

    - 图:由节点和边构成,用于表示复杂的关系,如网络拓扑结构。 - 哈希表:通过哈希函数实现快速查找,常用于实现字典和集合。 2. 算法: - 排序算法:包括冒泡排序、选择排序、插入排序、快速排序、归并排序和堆...

    经典编程题 经典算法题

    3. **图论算法**:Dijkstra最短路径算法、Floyd-Warshall所有最短路径算法、拓扑排序等,解决网络问题。 4. **动态规划**:"试题7"和"试题22"可能就是这类问题,通过自底向上的方式解决复杂问题。 5. **回溯法**:...

    Java、数据结构、线性代数等PPT.zip

    图则用于表示复杂的关系,如网络拓扑结构。 在Java语言方面,它是面向对象编程的代表,以其跨平台特性、丰富的类库和简洁的语法受到广泛欢迎。学习Java需要理解类、对象、封装、继承、多态等概念。此外,异常处理、...

    Data_Structures:通用数据结构的Java实现

    在实际项目中,常常需要结合多种数据结构,如使用栈和队列实现LRU缓存,或者利用树和图处理复杂的网络拓扑结构。 总之,"Data_Structures:通用数据结构的Java实现"涵盖了Java编程中必不可少的知识点,深入学习这些...

    cqsh3vj2模板1

    **其他模板**:包括日期判断、三角形问题、位图法、网络流、最大流、最小费用最大流、二分图、字符串处理(后缀数组、前缀数组Trie、字符串hash)、图论(最小树形图、拓扑排序)等,都是ACM竞赛中常见的问题类型,...

    数据结构--图的处理

    图还有其他重要的算法,如拓扑排序,用于有向无环图(DAG),确定所有节点的一个线性顺序,使得对于每条有向边 (u, v),节点 u 在排序中都位于 v 之前。最小生成树算法,如Prim或Kruskal,用于寻找连通图中权重最小...

    数据结构课程设计

    4. **图算法**:如深度优先搜索(DFS)和广度优先搜索(BFS),它们是解决图问题的基础,例如最短路径问题、拓扑排序等。 5. **数据结构实现**:在编程语言中实现这些数据结构,如C++中的STL容器(vector、list、...

    清华大学邓俊辉数据结构讲义

    - **拓扑排序**:讲解拓扑排序的原理及其应用场景。 - **双连通分量**:介绍双连通分量的定义及其在图中的应用。 - **最小生成树(MST)**:探讨最小生成树问题及其算法解决方案。 - **最短路径问题**:讲解最短路径...

    数据结构上机实验--代码

    9. **图论算法**:包括拓扑排序、最短路径、最小生成树等,这些算法在解决现实世界的问题中有着广泛的应用,比如网络路由、交通规划等。 在“新建文件夹”中,你将找到这些数据结构和算法的实现代码。通过阅读和...

    数据结构上机题基础代码

    7. **图算法**: 图可以表示复杂的关联关系,如最短路径问题(Dijkstra算法、Floyd算法)、拓扑排序等,它们在路由、社交网络分析等问题中有着广泛应用。 8. **哈希函数与散列表**: 哈希函数将数据映射到固定大小的...

    Code-DataStructuresandAlgorithms:练习数据结构和算法

    - **图算法**:Dijkstra最短路径算法、Floyd Warshall算法、拓扑排序。 - **动态规划**:解决具有重叠子问题和最优子结构的问题,如背包问题、最长公共子序列等。 - **回溯法**:用于解决组合优化问题,如八皇后...

    ACM_算法模板集史上最完整

    **图论算法**是算法竞赛中的重要部分,包括最短路径算法(如Dijkstra算法、Floyd-Warshall算法)、拓扑排序、强连通分量、最小生成树(如Prim算法、Kruskal算法)等。这些算法在解决网络流问题、旅行商问题等复杂...

    DataStructure-Algorithm:编码练习

    - **图算法**:Dijkstra最短路径算法、Floyd-Warshall所有顶点对最短路径算法、拓扑排序等。 通过LeetCode和《Crack the Coding Interview》中的问题,你可以实践这些数据结构和算法,加深理解并提升编程能力。这...

    contest:算法在线判断系统的解决方案代码,包括 codeforces、project euler 和 USACO

    3. **算法**:解题代码涵盖了各种算法,如排序(快速排序、归并排序、冒泡排序等)、搜索(二分查找、深度优先搜索、广度优先搜索)、图论(Dijkstra算法、Floyd算法、拓扑排序)、动态规划、回溯法等。这些算法是...

Global site tag (gtag.js) - Google Analytics