码迷,mamicode.com
首页 > 编程语言 > 详细

拓扑排序【模板】

时间:2015-05-03 00:51:30      阅读:257      评论:0      收藏:0      [点我收藏+]

标签:

1.普通判断拓扑排序、输出路径:queue<int> Q
2.满足字典序的拓扑排序:priority_queue<int,vector<int>, greater<int> > Q;
保证了权值小的优先级高,取出的时候保证序号是队列中最小的。
3.满足最小的尽量在前面(不保证是字典序):priority_queue<int> Q;
反向建图,用优先队列存储将入度为0的点,再遍历权值大的结点,从大到小存入数组ans[],最后ans[]逆序就是满足要求的拓扑排序

const int MAXN = 110;
const int MAXM = 10010;

int head[MAXN],indegree[MAXN],ans[MAXN],N,M,T;
//indegree[]存放入度,ans[]逆序存放拓扑序列
struct EdgeNode
{
    int to;
    int w;
    int next;
};
EdgeNode Edges[MAXM];

int toposort()
{
    queue<int> Q;//拓扑排序 
    int u;
    for(int i = 1; i <= N; i++)
    {
        if(indegree[i] == 0)
            Q.push(i);
    }
    int id = 0;
    while(!Q.empty())
    {
        u = Q.front();
        ans[id++] = u;  //记录拓扑序列
        Q.pop();
        for(int i = head[u]; i != -1; i = Edges[i].next)
        {
            indegree[Edges[i].to]--;
            if(indegree[Edges[i].to]==0)
            {
                Q.push(Edges[i].to);
            }
        }
    }
    if(id == N)
    {
        for(int i = N; i >= 1; i--)//逆序输出  
            if(i != 1)  
                cout << ans[i] << " ";  
            else  
                cout << ans[i] << endl;  
        return true;
    }
    else
        return false;
}

拓扑排序【模板】

标签:

原文地址:http://blog.csdn.net/lianai911/article/details/45444929

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!