拓扑排序(模板)

这篇文章主要是提供模板…………
基本思路很简单,看看下面的几个步骤就会了……
(1)从网中选择一个入度为零的顶点输出;
(2)删除该顶点及其于该点有关的所有边;
(3)是否还有入度为零的顶点?若有,执行(1),否则结束。
算法实现:(已使用STL
vector数组存储图,然后用d数组来存储每个点的入度,先遍历一次,找出入度为0的点,把该点入栈
进入循环,直到循环为空为止
OK,上代码:
#include<iostream>
#include<vector>
#include<cstdio>
#include<stack>
#include<cstring>
using namespace std;
vector<int>g[105];
int M,N,d[105];
bool vis[105] = {false};
void toposort()
{
    stack<int>sta;
    for (int i=0;i<N;i++) 
        if (!vis[i] and d[i]==0)//如果该点没有被访问过,且入度为0 
            vis[i]=true,sta.push(i);//标记一下,加入栈 
    while(!sta.empty()){
        int nod=sta.top();sta.pop();
        cout<<nod<<" ";
        for(int i=0;i<g[nod].size();i++){
            int u=g[nod][i];//将前驱为0的节点,对应的边去掉,对应点的入度减一 
            d[u]--;
        }
        for (int i=0;i<N;i++){//循环里面再做一次相同的操作 
            if (!vis[i] and d[i]==0)
                vis[i]=true,sta.push(i);
        }
    }
//    for(int i = 0; i < N; i++){//查看是否有回路
//        if(!vis[i]) return false;
//    }
//    return true;
}
int main()
{
        cin>>N>>M;
        for(int i = 0; i < N+1; i++) g[i].clear();
        for(int i = 0; i < M; i++)
        {
            int a,b;
            cin>>a>>b;
            d[b]++;
            g[a].push_back(b);
        }
        toposort();
return 0;
}
END


猜你喜欢

转载自blog.csdn.net/qq_36992525/article/details/79273689
今日推荐