用邻接链表和队列实现拓扑排序

之前写拓扑排序是通过邻接矩阵写的,应对小的数据量还可以,但要是顶点数很大时,开的邻接矩阵就未免太大了.今天学习了用邻接表实现拓扑排序,比较简单,所幸,写完后一遍编译通过 + 一遍AC.

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

**输入**
若干行整数,第一行有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 <queue>
#include <cstdio>
using namespace std;

struct node//邻接表里的每个元素是一个结构体
{
    int num;
    node *next;
    node(){
        next = NULL;
    }
    node(int x):num(x){
        next = NULL;
    }
};

struct list
{
    int num;
    node *next;
    void append(node *&a)
    {
        a->next = next;//将a插到表头里去
        next = a;
    }
}point[2000];

int v, a;//顶点数,边数
int from, to;
int vis[2000], indeg[2000];

int main()
{
    queue<int> q;
    scanf("%d%d",&v,&a);
    while(a--)
    {
        scanf("%d%d",&from,&to);
        indeg[to]++;
        node *tmp = new node(to);
        point[from].append(tmp);//连接有向图
    }
    for(int i=1;i<=v;i++)
        if(indeg[i] == 0)
        {
            q.push(i);
            vis[i] = 1;
            break;
        }
    while(! q.empty())
    {
        int temp = q.front();
        q.pop();
        printf("v%d ",temp);
        node *t = point[temp].next;
        while(t)
        {
            indeg[t->num]--;
            t = t->next;
        }
        for(int i=1;i<=v;i++)//要求从小到大输出,所以每次从小到大遍历
            if(indeg[i]==0 && vis[i]==0)
            {
                vis[i] = 1;
                q.push(i);
                break;
            }
    }
    return 0;
}
    原文作者:拓扑排序
    原文地址: https://blog.csdn.net/pku_Coder/article/details/53540278
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞