JAVA邻接表实现拓扑排序

由于一直不适用邻接表 ,现在先贴一段使用邻接矩阵实现图的拓扑排序以及判断有无回路的问题。自己做的图。将就看吧。

package TopSort;

import java.util.LinkedList;
import java.util.Scanner;

/*拓扑序列:对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性
 * 序列,使得图中任意一对顶点u和v,若<u,v> ∈E(G),则u在线性序列中出现在v之前。
 *
 */

public class TopSort {

	static int[][] map;
	static int[] indegree; // 这n个点的入度
	static int n, m; //顶点数,边数
	static LinkedList<Integer> stack = new LinkedList<Integer>(); //模拟栈

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		n = sc.nextInt();
		m = sc.nextInt();
		map = new int[n][n];
		indegree = new int[n];
		for (int i = 0; i < n; i++) {
			indegree[i] = 0;
			for (int j = 0; j < n; j++) {
				map[i][j] = 0;
			}
		}
		int x, y;
		for (int i = 0; i < m; i++) {
			x = sc.nextInt();
			y = sc.nextInt();
			if (map[x][y] == 0) { // 判重边
				map[x][y] = 1;
				indegree[y]++;
			}

		}
		topSort1();
		topSort2();
	}
	//遍历顺序一:广度遍历
	private static void topSort1() {
		int count = 0; //判断有无回路(是否成环)
		for (int i = 0; i < n; i++) {
			if (indegree[i] == 0) {
				stack.addFirst(i);
				indegree[i] = -1;
			}
		}
		while (!stack.isEmpty()) {
			int p = stack.removeFirst();
			System.out.print(p + " ");
			count++;
			for (int j = 0; j < n; j++) {
				if (map[p][j] == 1) {
					map[p][j] = 0;
					indegree[j]--;
					if (indegree[j] == 0) {
						stack.addFirst(j);
						indegree[j] = -1;
					}
				}
			}
		}
		System.out.println();
		if(count <n) System.out.println("The network has a cycle!"); //当输出的顶点数小于图中的顶点数时,输出有回路信息
		else  System.out.println("The network has not a cycle!");
	}
	//遍历顺序二:深度遍历
	private static void topSort2() {
		int count = 0; //判断有无回路(是否成环)
		for (int i = 0; i < n; i++) {
			if (indegree[i] == 0) {
				stack.addFirst(i);
				indegree[i] = -1;
			}
			while (!stack.isEmpty()) {
				int p = stack.removeFirst();
				System.out.print(p+" ");
				count ++;
				for (int j = 0; j < n; j++) {
					if (map[p][j] == 1) {
						map[p][j] = 0;
						indegree[j]--;
						if (indegree[j] == 0) {
							stack.addFirst(j);
							indegree[j] = -1;
						}
					}
				}
			}
		}
		System.out.println();
		if(count <n) System.out.println("The network has a cycle!"); //当输出的顶点数小于图中的顶点数时,输出有回路信息
		else  System.out.println("The network has not a cycle!");
	}

}
/*
 * 7 8
 *
 * 0 1
 * 0 3
 * 1 2
 * 1 6
 * 3 6
 * 4 3
 * 4 5
 * 5 6
 *
 * */

  

时间: 2024-10-12 04:16:44

JAVA邻接表实现拓扑排序的相关文章

图论——图的邻接表实现——Java语言(完整demo)

1.图的简单实现方法--邻接矩阵 表示图的一种简单的方法是使用一个一维数组和一个二维数组,称为领接矩阵(adjacent matrix)表示法. 对于每条边(u,v),置A[u,v]等于true:否则,数组的元素就是false.如果边有一个权,那么可以置A[u][v]等于该权,而使用一个很大或者很小的权来标记不存在的边.虽然这样表示非常简单,但是,它的空间需求则为θ(|V|2),如果图的边不是很多,那么这种表示的代价就太大了.若图是稠密(dense)的:|E|=θ(|V|2),则领接矩阵是合适的

基于邻接表的拓扑排序实现

上一篇博客实现了图的基本操作(使用邻接表),包括图的创建.输出.遍历等,这次来实现一下拓扑排序.拓扑排序基本原理可以参考以前转载的一篇博客 http://www.cnblogs.com/zhangbaochong/p/5406159.html 由于代码比较简单,就直接贴出来了 1 #include <queue> 2 #include <vector> 3 #include <stack> 4 #include <iostream> 5 using name

数据结构Java版之邻接表实现图(十)

邻接表实现图,实际上是在一个数组里面存放链表,链表存放的是连接当前节点的其他节点. package mygraph; import java.util.ArrayList; import java.util.List; public class Table { private List<List<Character>> list; private List<Character> headNodes; private int n; private int nVerts;

用邻接表实现某个点入度和出度

#include <cstdio> #include <cstring> #include <cctype> using namespace std; typedef struct node{//邻接表上的节点 int n; struct node * next; } GNode; typedef struct graph{//图的整个结构 int cn;//顶点个数 int bn;//边的个数 GNode *list;//顶点的数组相当于list[]; }Graph;

用邻接表实现无向图的创建与输出

1 #include<stdio.h> 2 #include <iostream> 3 #include<algorithm> 4 using namespace std; 5 #define MVNum 100 6 typedef struct ArcNode // 边表结点 7 { 8 int adjvex; // 邻接点域,存储该顶点对应的下标 9 //int info; //用于存储权值,对于非网图可以不需要 10 struct ArcNode *nextarc

hdu1285 确定比赛名次 (拓扑排序)

确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 16782    Accepted Submission(s): 6659 Problem Description 有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直

算法总结之拓扑排序

拓扑排序 1.一般应用       拓扑排序常用来确定一个依赖关系集中,事物发生的顺序.例如,在日常工作中,可能会将项目拆分成A.B.C.D四个子部分来完成,但A依赖于B和D,C依赖于D.为了计算这个项目进行的顺序,可对这个关系集进行拓扑排序,得出一个线性的序列,则排在前面的任务就是需要先完成的任务. 2.实现的基本方法 (1)从有向图中选择一个没有前驱(即入度为0)的顶点并且输出它. (2)从网中删去该顶点,并且删去从该顶点发出的全部有向边. (3)重复上述两步,直到剩余的网中不再存在没有前趋

拓扑排序模板

拓扑排序是对ADG(有向无环图进行线性排序) 模板: 队列实现 #include<cstdio> #include<cstring> #include<algorithm> #include<queue> using namespace std; int indegree[100]; queue<int> q; int n,m; bool map[100][100]; int a[100]; int topo(int n) { int cnt =

拓扑排序介绍

拓扑排序介绍 拓扑排序(Topological Order)是指,将一个有向无环图(Directed Acyclic Graph简称DAG)进行排序进而得到一个有序的线性序列. 这样说,可能理解起来比较抽象.下面通过简单的例子进行说明! 例如,一个项目包括A.B.C.D四个子部分来完成,并且A依赖于B和D,C依赖于D.现在要制定一个计划,写出A.B.C.D的执行顺序.这时,就可以利用到拓扑排序,它就是用来确定事物发生的顺序的. 在拓扑排序中,如果存在一条从顶点A到顶点B的路径,那么在排序结果中B