• 图论————拓扑排序


    拓扑排序是一个非常重要的知识点,不只是在图论上会应用到,在其他地方也会涉及。

    一.定义

    对一个有向无环图(Directed Acyclic Graph, DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若<u,v> ∈E(G),则u在线性序列中出现在v之前。

    通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。(百度上抄的,不懂也没事),总之拓扑排序就是一种遍历方式。

    二.拓扑序列算法思想

    (1)从有向图中选取一个没有前驱(即入度为0)的顶点,并输出之;

    (2)从有向图中删去此顶点以及所有以它为尾的弧;

    重复上述两步,直至图空,或者图不空但找不到无前驱的顶点为止。

    代码实现

    原题链接:https://www.acwing.com/problem/content/850/

    #include<bits/stdc++.h>
    
    using namespace std;
    const int N = 100010, M = 100010;
    struct EDGE {
        int to,next;
    } edge[M];
    int d[N];
    int n,m;
    int h[N],cnt;
    int dis[N];
    
    void add(int u, int v) {
        edge[++cnt].to=v;
        edge[cnt].next=h[u];
        h[u]=cnt;
    }
    int q[N];
    int topo(){
        int hh=0,tt=-1;
        for(int i=1;i<=n;i++)
        if(!d[i])q[++tt]=i;;
        while(hh<=tt){
            int now=q[hh++];
    
            for(int i=h[now];i!=-1;i=edge[i].next){
                int j=edge[i].to;
                if(--d[j]==0)
                q[++tt]=j;
            }
        }
        return tt==n-1;
    }
    
    int main(){
        cin>>n>>m;
        int x,y;
        memset(h,-1,sizeof(h));
        for(int i=1;i<=m;i++){
            cin>>x>>y;
            add(x,y);
            d[y]++;
        }
    
        if(!topo())cout<<"-1";
        else 
        for(int i=0;i<n;i++)cout<<q[i]<<' ';
        return 0;
    
    }
    

      

  • 相关阅读:
    MyEclipse中代码提醒功能
    oracle12c创建用户等问题
    java中的构造块、静态块等说明
    jquery中的get和post、ajax有关返回值的问题描述
    最大半连通子图 BZOJ 1093
    最小生成树计数 BZOJ 1016
    水平可见直线 BZOJ 1007
    分金币 BZOJ 3293
    游走 BZOJ 3143
    糖果 BZOJ 2330
  • 原文地址:https://www.cnblogs.com/myhnb/p/11300883.html
Copyright © 2020-2023  润新知