拓扑排序
一、简介
- 拓扑排序是对一个有向无环图中所有顶点的排序,使得图中任意两个顶点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; }