函数库 拓扑排序

void toposort(int n)
{//该方法将优先队列(每次取出最大值)和拓扑排序结合
    int i;
    priority_queue<int> q;
    for(i=1;i<=n;i++)
        if(indegree[i]==0)q.push(i);
    int t,k=0,j;
    while(!q.empty())
    {
        t=q.top();
        q.pop();
        ans[k++]=t;
        int tt=graph[t].size();
        for(j=0;j<tt;j++)
        {
            indegree[graph[t][j]]--;
            if( indegree[graph[t][j]]==0)
                q.push(graph[t][j]);
        }
    }
}
 for(i=0;i<n;i++)//可直接嵌套入主函数中,邻接数组,简单易懂!
    {
        for(j=1;j<=n;j++)
        {
            if(indegree[j]==0)
            {
                    indegree[j]=-1;
                    if(T==0)
                    printf("%d",j),T++;
                    else
                    printf(" %d",j);
                    for(k=1;k<=n;k++)
                    {
                        if(graph[j][k]==1)indegree[k]--;
                    }
                    break;
            }
        }
   }
int toposort(int n)
{//通过建立标志值,判定各种条件。用于限制条件较多的题目。
    int in[MAX];
    memcpy(in,indegree,sizeof(indegree));
    stack<int > s;
    int i;
    for(i=0;i<n;i++)
        if(in[i]==0)
        s.push(i);
    int flag=0;
    int t,j=0;
    while(!s.empty())
    {
        if(s.size()>1)
            flag=1;
        t=s.top();
        s.pop();
        rem[j++]=t;
        for(i=0;i<n;i++)
            if(graph[t][i]!=0)
            if(--in[i]==0)
            s.push(i);
    }
    if(j!=n)
        return 1;
    else if(flag==1)
        return 2;
    return 0;
}



转载于:https://www.cnblogs.com/ghh1995/p/4349022.html

在使用优先队列实现拓扑排序时,通常我们会先构建一个有向无环图(DAG),然后利用优先队列来存储顶点及其入度(出度为0的顶点被视为源点)。下面是基于 Python 中 `heapq` 库实现的一个简化版示例: ```python import heapq def topological_sort(graph): # 初始堆(小根堆,最小元素在堆顶) queue = [(node, 0) for node in graph if graph[node].count(0) == len(graph[node])] heapq.heapify(queue) # 结果列表,存放已排序的节点 result = [] while queue: # 弹出入度为0的节点(相当于优先级最低) current_node, _ = heapq.heappop(queue) result.append(current_node) # 更新其他节点的入度,如果有新的入度为0的节点,添加回堆 for neighbor, edge_weight in graph[current_node]: graph[neighbor][current_node] -= 1 if graph[neighbor][current_node] == 0 and neighbor not in result: heapq.heappush(queue, (neighbor, 0)) return result if is_directed_acyclic_graph(graph) else None # 辅助函数检查图是否为有向无环图 def is_directed_acyclic_graph(graph): visited = set() def dfs(node): visited.add(node) for neighbor, weight in graph[node]: if neighbor not in visited: if not dfs(neighbor): # 如果邻接点存在环,则返回False return False return True return all(dfs(node) for node in graph) # 示例: graph = { 'A': [ ('B', 1), ('C', 1) ], 'B': [ ('C', 1), ('D', 1) ], 'C': [('D', 1)], 'D': [] } print(topological_sort(graph)) # 输出 ['A', 'C', 'B', 'D'] ``` 这个代码首先找到所有入度为0的节点加入堆,然后在每次弹出堆顶节点时,更新与其相邻节点的关系,直到堆为空。注意,由于拓扑排序可能会返回多种排列,这里假设图中不存在环,如果可能存在环,需要额外检查图是否真的是DAG。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值