有向图 拓扑排序

拓扑排序

(1)仅针对有向无环图;

(2)图的拓扑排序不唯一,只需保证各节点在图上的原始顺序保持不变;

(3)实现(可借助辅助队列或栈,时间复杂度为O(|E|+|V|));

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

class CycleFoundException extends Exception {}

public class Test {
	public static class GrapNode {
		public String name;
		public int indegree = 0;
		public List<GrapNode> neighbors = new ArrayList<GrapNode>();
		GrapNode(String name) {
			this.name = name;
		}
		public void addNeighbors(GrapNode... nodes) {
			for(GrapNode node : nodes) {
				node.indegree++;
				neighbors.add(node);
			}
		}
	}
	public static List<String> topSort(GrapNode... grap) throws CycleFoundException{
		Queue<GrapNode> queue = new LinkedList<GrapNode>();
		List<String> sorted = new ArrayList<String>();
		for(GrapNode node : grap) {
			if(node.indegree == 0)
				queue.add(node);
		}
		while(!queue.isEmpty()) {
			GrapNode node = queue.remove();
			sorted.add(node.name);
			for(GrapNode n : node.neighbors) {
				if(--n.indegree == 0)
					queue.add(n);
			}
		}
		if(sorted.size() < grap.length)
			throw new CycleFoundException();
		return sorted;
	}
	public static void main(String[] args) {
		GrapNode v1 = new GrapNode("v1");
		GrapNode v2 = new GrapNode("v2");
		GrapNode v3 = new GrapNode("v3");
		GrapNode v4 = new GrapNode("v4");
		GrapNode v5 = new GrapNode("v5");
		GrapNode v6 = new GrapNode("v6");
		GrapNode v7 = new GrapNode("v7");
		v1.addNeighbors(v2,v3,v4);
		v2.addNeighbors(v4,v5);
		v3.addNeighbors(v6);
		v4.addNeighbors(v3,v6,v7);
		v5.addNeighbors(v4,v7);
		v7.addNeighbors(v6);
		try {
			List<String> sorted = topSort(v1,v2,v3,v4,v5,v6,v7);
			for(String s : sorted) {
				System.out.print(s+", ");
			}
				
		} catch (CycleFoundException e) {
			e.printStackTrace();
		}
	}
}/*output:
v1, v2, v5, v4, v3, v7, v6, 
*///:~


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值