拓扑排序的处理

重点在于加入入度为0的点,把前驱的边先去掉,进行处理/

如何想到运用?

需要用到,建立一个邻接表

int n=quiet.length;

int[]in=new int[in];

List<Integer>list[]=new List[n];

int[]ans=new int [n];

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

list[i]=new ArrayList<>();

ans[i]=i;

如果一个问题中需要将比较类的二维数组进行有向比较,并且需要通过另一个值的大小进行比较,这个时候就需要用邻接表进行处理

for(int i=0;i<richer.length;i++){

int u=richer[i][0];

intv=recher[i][1];

in[v]++;

list[u].add(v);

此时将u与v建立的表进行了链接.

这时就要进行拓扑查询

Queue<Integer>Q=new ArrayDeque<>();

此时需要加入入度为0的点,这时添加入排位

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

if(in[i]==0)Q.add(i);}

更新堆中的元素

while(!Q.isEmpty())[

int u=Q.poll();//将堆顶元素去除

for(int v:list[u]){

if(quiet[ans[u]]<quiet[ans[v]])

ans[v]=ans[u];

in[v]--;

if(in[v]==0){

Q.add(v);}}}return ans}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
拓扑排序是一种对有向无环图(DAG)进行排序的算法,它可以确定图的线性顺序,使得对于图的每一条有向边 (u, v),节 u 在排序都排在节 v 的前面。在Python,我们可以使用广度优先搜索(BFS)或深度优先搜索(DFS)来实现拓扑排序。 一种方法是使用广度优先搜索(BFS)。我们首先构建一个入度矩阵,记录每个节入度(即指向该节的边的数量)。然后,我们创建一个队列,并将入度为0的节加入队列。接下来,我们循环处理队列的节,将其添加到结果列表,并更新其子节入度。如果子节入度变为0,则将其加入队列。如果最终结果列表的长度小于图的数量,则说明图存在环。否则,结果列表就是拓扑排序的结果。 下面是使用广度优先搜索实现拓扑排序的Python代码示例: ``` # 构建图类 class Graph(): ... def topological_sort(self): in_degree_map = {} # 入度map queue = Queue() result = [] # 构造入度矩阵 for vertex in self.vertices.values(): if len(vertex.inEdges) == 0: queue.put(vertex) # 入队 else: in_degree_map[vertex = len(vertex.inEdges) while not queue.empty(): vertex = queue.get() result.append(vertex.value) for edge in vertex.outEdges: in_degree = in_degree_map.get(edge.to) - 1 in_degree_map[edge.to = in_degree if in_degree == 0: queue.put(edge.to) if len(result) < len(self.vertices): print('图有环,无法进行拓扑排序') else: print('图无环,拓扑排序结果为:') print(result) ``` 另一种方法是使用深度优先搜索(DFS)。我们可以给每个节标记3种状态:未访问、正在访问和已访问。在DFS过程,我们首先将节标记为正在访问,然后递归地访问其邻居节。当我们遇到一个已经标记为正在访问的节时,说明图存在环,无法进行拓扑排序。当我们访问完一个节的所有邻居节后,我们将该节标记为已访问,并将其添加到结果列表的开头。最后,结果列表的顺序就是拓扑排序的结果。 这是使用深度优先搜索实现拓扑排序的Python代码示例: ``` # 构建图类 class Graph(): ... def topological_sort_dfs(self): color_map = {} # 节颜色map result = [] def dfs(vertex): nonlocal result color_map[vertex = 'gray' # 标记为正在访问 for edge in vertex.outEdges: if color_map.get(edge.to) == 'gray': print('图有环,无法进行拓扑排序') return elif color_map.get(edge.to) == 'white': dfs(edge.to) color_map[vertex = 'black' # 标记为已访问 result.insert(0, vertex.value) for vertex in self.vertices.values(): color_map[vertex = 'white' # 标记为未访问 for vertex in self.vertices.values(): if color_map[vertex == 'white': dfs(vertex) print('图无环,拓扑排序结果为:') print(result) ``` 以上是两种使用Python实现拓扑排序的方法:广度优先搜索(BFS)和深度优先搜索(DFS)。具体选择哪种方法取决于实际需求和图的特

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值