算法——图之有向图

本文介绍了有向图的概念及其表示方法,通过邻接表矩阵展示有向图,并探讨了有向图在任务调度中的应用。接着详细阐述了拓扑排序的原理和实现,包括如何判断有向图是否存在环。此外,文章还讲解了有向图的强连通分量,提出了kosaraju算法来找出强连通分量。最后指出,有向图的最短路径问题可以使用广搜解决,与无向图的处理方式类似。
摘要由CSDN通过智能技术生成

我们主要讨论一下方面:

1.有向图的表示

有向图的可达性
有向图的路径

2.
判断有向图中是否有环
拓扑排序,优先级限制下的调度问题

3.
有向图的强连通性


有向图的表示

和无向图中的一样,我们也采用邻接表矩阵的方式来表示有向图。只需要修改addEdge方法,只增加一条边,而不是增加双向边就可以了。

public class DiGraph {
	private int V;  // 节点数
	private int E;  // 边的数目
	private List<Integer>[] adj; // 邻接表矩阵
	
	public DiGraph(int V) { // 创建节点个数为V的没有边的有向图
		this.V = V;
		this.E = 0;
		adj = (List<Integer>[])new List[V];
		for (int i = 0; i < V; i++) {
			adj[i] = new ArrayList<Integer>();
		}
	}
	
	public void addEdge(int v, int w) { // 在有向图中增加边v->w
		adj[v].add(w);
		E++;
	}
	
	public List<Integer> adj(int v) { // 返回v节点的相邻节点
		return adj[v];
	}
	
	public int V() { // 返回节点数
		return V;
	}
	
	public int E() { // 返回边的数目
		return E;
	}
	
	public String toString() { // 打印图
		String s = V + " 个顶点, " + E + " 条边\n";
		for (int i = 0; i < V; i++) {
			s += i + ": ";
			for (Integer node : adj(i)) {
				s += node + " ";
			}
			s += "\n";
		}
		return s;
	}
	
	public DiGraph reverse() {
		DiGraph g = new DiGraph(V);
		for (int i = 0; i < V; i++) {
			for (Integer node : adj[i]) {
				g.addEdge(node, i);
			}
		}
		return g;
	}
}
我们在其中增加了reverse方法,获得当前表的反向表,即将所有边的方向反向,例如v->w变成w-v。


有向图的路径和可达性

这个也和无向图中的一样,只需要将图的类改成DiGraph就可以直接使用了。


有向图在许多应用中发挥重要的作用,一个典型的应用就是任务调度。

有向图的一个节点就代表着一个任务,有向图的边代表着优先级,例如v-&g

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值