拓扑排序模板(Kahn算法和DFS实现)

拓扑排序思想:

Kahn模板:每次取出入度为0的顶点删掉,并删掉和该点有关的边,需要维护一个入度为0的队列或者栈

//Kahn算法,关键在于需要维护一个入度为0的顶点的集合
int n,m;
int inDeg[N];  //i点的入度
vectorvec[N];  //i点的邻接表,即i与哪些点相连
int ans[N];    //排序结果数组

int topSort()    //返回值代表是否有环,排序结果在ans数组
{
    int cnt=0;
    queueq;  //如果需要相同优先级的顶点,序号小的先输出,则可建立优先队列,即
    //priority_queue,greater >q;
    while(!q.empty())
        q.pop();
    for(int i=1;i<=n;i++)
        if(inDeg[i]==0)
            q.push(i);
    while(!q.empty())
    {
        int now = q.front();
        q.pop();
        ans[++cnt]=now;     //个数+1并存数组
        int len = vec[now].size();
        for(int i=0;i>n>>m;
    for(int i=1;i<=n;i++)
        vec[i].clear();
    memset(inDeg,0,sizeof(inDeg));
    for(int i=1;i<=m;i++)
    {
        cin>>x>>y;
        inDeg[y]++;
        vec[x].push_back(y);
    }
}

DFS实现模板:

//dfs实现,从出度的角度来构造,递归到最后返回
int n,m;
vectorvec[N];  //i点的邻接表,即i与哪些点相连
int ans[N],cnt;    //排序结果数组,cnt记录个数
int parent[N]; //记录其前置节点
//int d[N], Time, f[N]; //可以不要,时间time初始化为0,d[]记录第一次被发现时,f[]记录结束检查时
int vis[N];  //标记数组vis[i]=0表示还未访问过点i,c[i]=1表示已经访问过点i,并且还递归访问过它的所有子孙,c[i]=-1表示正在访问中,尚未返回

bool dfs(int s)  //深度优先搜索(邻接表实现),记录时间戳,寻找最短路径
{
    vis[s]=-1;   //正在访问
    //Time++;d[s]=Time;
    int len = vec[s].size();
    for(int i=0;i>x>>y;
        vec[x].push_back(y);
    }
}

你可能感兴趣的:(模板)