拓扑排序1

拓扑排序

一、简介

  • 拓扑排序是对一个有向无环图中所有顶点的排序,使得图中任意两个顶点u和v,若存在一条由u指向v的边,那么,拓扑排序后,顶点u一定在v的前面。

二、解析

  • 我们使用一个数组来记录每个顶点的入度,用一个二维数组(此处也可以用多个一维数组组成一个类似于Java中的二维数组,例如vector ve[100];)来记录顶点之间的关系,首先将入度为零的点加入队列,然后依次取出一个点,将与其相连的点的入度都减一,若有入度为零的就将其加入队列,输出每次取出的那个点,重复此过程,实现拓扑排序。若要求在同等条件下,编号小的顶点在前,那么将队列换成优先队列即可。

三、相关题目(北大poj平台,题号4865)

  • 描述

    给出一个图的结构,输出其拓扑排序序列,要求在同等条件下,编号小的顶点在前

  • 输入

    若干行整数,第一行有2个数,分别为顶点数v和弧数a,接下来有a行,每一行有2个数,分别是该条弧所关联的两个顶点编号

  • 输出

    若干个空格隔开的顶点构成的序列(用小写字母)

  • 样例输入

    6 8
    1 2
    1 3
    1 4
    3 2
    3 5
    4 5
    6 4
    6 5
    
  • 样例输出

    v1 v3 v2 v6 v4 v5
    
  • 代码实现

    #include<iostream>
    #include<vector>
    #include<algorithm>
    #include<queue>
    using namespace std;
    
    int main(){
        int in[1000];
        vector<int> ve[100];
        int v,a,x,y;
        cin>>v>>a;
        for(int i=1;i<=v;i++){
            ve[i].clear();
            in[i]=0;
        }
        while(a--){
            cin>>x>>y;
            ve[x].push_back(y);
            in[y]++;
        }
        priority_queue<int,vector<int>,greater<int>> q;//优先队列,greater升序,less降序
        for(int i=1;i<=v;i++){
            if(in[i]==0){
                q.push(i);
            }
        }
        while(!q.empty()){
            int tmp=q.top();
            q.pop();
            for(int i=0;i<ve[tmp].size();i++){
                int tmp2=ve[tmp][i];
                in[tmp2]--;
                if(in[tmp2]==0){
                    q.push(tmp2);
                }
            }
            cout<<"v"<<tmp<<" ";
        }
    
        system("pause");
        return 0;
    }
    
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值