拓扑排序(java实现)

拓扑排序是判断有向图是否有环的基础算法

 

  这是节点的bean

public class Node {
		public String name; //节点名字
		public Integer indegree; //入度个数
		public List<Node> child=new ArrayList<Node>();//所指向的几点
	
		
	
	
		
	
		@Override
		public String toString() {
			return "Node [name=" + name + "]";
		}
	
		public String getName() {
			return name;
		}
	
		public void setName(String name) {
			this.name = name;
		}
	
	
		public Integer getIndegree() {
			return indegree;
		}
	
		public void setIndegree(Integer indegree) {
			this.indegree = indegree;
		}
	
		public List<Node> getChild() {
			return child;
		}
	
		public void setChild(List<Node> child) {
			this.child = child;
		}
	
		public Node(String name) {
			this.name = name;
		}
		public Node(){}
	
	}

  拓扑排序的核心

	public static void topSort(List<Node> vs) {
		Queue<Node> q = new LinkedList<Node>();
		int size=vs.size();
		int count = 0;
       //初始化队列
		for (Node n : vs) {
			if (n.indegree == 0)
				q.add(n);
		}
		//将入度为0的节点输出 并且将其所指向的节点的入度值-1
		while (!q.isEmpty()) {
			Node v = q.poll();
			count++;
			for (Node w : v.getChild()) {
				if (--w.indegree == 0)
					q.add(w);
			}
		}
		//计算节点的个数和 最后出队列的个数 若不一样则有环
		if (count !=size) {
			
			System.out.println(" 图有圈");
		}
	}

因为每次要set属性很麻烦所以写了一个邻接矩阵转化为list的代码

public static  List<Node> ArrayToGraph(int[][] a) throws NullPointerException{
	  //判断是否为矩阵 
	  //Y 继续   N 返回NULL
	  for(int i=0;i<a.length;i++){
		  if(a[i].length!=a.length){
			  return null;
		  }
	  }
	  //建立list 泛型为节点
	   List<Node> list=new ArrayList<Node>();
	   
	   //建立map key为 节点的编号  value 为 节点的所指向的节点的编号
	   @SuppressWarnings("rawtypes")
	  Map<Integer,ArrayList> map=new HashMap<Integer,ArrayList>();
	  //  对map 赋值
	   
	   //建立入度数组
	   int[] indegree=new int[a.length+1];
	   //计算每个节点的入度值
	   for(int i=0;i<a.length;i++){
		   for(int j=0;j<a.length;j++) 
		   {
			   indegree[i]=a[j][i]+indegree[i];
		   }
	   }
	   
	   for(int i=0;i<a.length;i++){
		   Node v1 = new Node("v"+i);
		   //为每一个node节点的indegree 属性赋值
		   v1.indegree=indegree[i];
		   list.add(v1);
		   ArrayList<Integer> li=new ArrayList<Integer>();
		   for(int j=0;j<a[i].length;j++){
			   if(a[i][j]==1)
				   li.add(j);
		   }
		   map.put(i, li);
	   }
	  
	   // 为每一个node节点的child 属性加入 对应的Node
	   for(Entry<Integer, ArrayList> m:map.entrySet()){
		     Node n= list.get(m.getKey());
		     ArrayList<Integer> l=m.getValue();
		     for(Integer i:l){
		    	 n.child.add(list.get(i));
		     }
	   }
	 
	 
	   
	  return list;
  }

测试 

public static void main(String[] args) {
	  int a[][]={{0,1,1,1,0,0,0},
				{0,0,0,1,1,0,0},
				{0,0,0,0,0,1,0},
				{0,0,1,0,0,1,1},
				{0,0,0,1,0,0,1},
				{0,0,0,0,0,0,0},
				{0,0,0,0,0,1,0}
				};
			List<Node> list=Vertex.ArrayToGraph(a);
		try{Vertex.topSort(list);}
		catch(NullPointerException e){
			System.out.println("请输入矩阵");
		}
			

	}

算法的思想很多 大家可以百度 这里主要是怎么实现

初次写博客,请大家见谅(而且我还很懒)

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java实现拓扑排序可以使用深度优先排序算法。首先,创建一个顶点类Vertex,其中包含一个标签属性label。然后,建立一个图像(Graph)的Java抽象实现,该实现包括图的顶点和边的信息。通过遍历图的顶点和边,使用深度优先搜索算法来进行拓扑排序。在排序之前,可以根据需要给顶点设置优先级属性,以控制排序的精确度。实现的时间复杂度为O(|V| |E|),其中|V|表示顶点数,|E|表示边的数量。可以参考算法导论中深度优先排序算法的Java实现。 下面是一个简单的Java实现示例: ```java import java.util.ArrayList; import java.util.List; import java.util.Stack; public class TopologicalSort { private List<Vertex> sortedVertices; public List<Vertex> topologicalSort(Graph graph) { sortedVertices = new ArrayList<>(); Stack<Vertex> stack = new Stack<>(); for (Vertex vertex : graph.getVertices()) { if (!vertex.isVisited()) { dfs(vertex, stack); } } return sortedVertices; } private void dfs(Vertex vertex, Stack<Vertex> stack) { vertex.setVisited(true); for (Vertex neighbor : vertex.getNeighbors()) { if (!neighbor.isVisited()) { dfs(neighbor, stack); } } stack.push(vertex); sortedVertices.add(vertex); } } class Vertex { private char label; private boolean visited; private List<Vertex> neighbors; public Vertex(char label) { this.label = label; this.visited = false; this.neighbors = new ArrayList<>(); } // getters and setters // ... } class Graph { private List<Vertex> vertices; public List<Vertex> getVertices() { return vertices; } // other methods // ... } ``` 以上是一个简单的Java实现示例,其中Graph类表示图,Vertex类表示顶点。在TopologicalSort类中,topologicalSort方法使用深度优先搜索算法进行拓扑排序,最终返回排序后的顶点列表。可以根据实际需求对代码进行修改和优化。 参考链接:维基百科提供了更多关于拓扑排序的信息,可以进一步了解。中的参考资料还提供了Graph和Vertex类的代码示例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值