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