没错就是中篇 因为还有好多图论姿势呢23333
定义:拓扑排序是对有向无环图的顶点的一种排序,它使得如果存在一条从顶点A到顶点B的路径,那么在排序中B出现在A的后面。
就是说每个顶点出现且只出现一次;
若A在序列中排在B的前面,则在图中不存在从B到A的路径。
具体的实现:
1、每次找到入度为0的点,将其加入已排好序的队列队尾。
2、将当前入度为0的点以及它所连出去的边都在图中删掉。
3、重复1、2步直至图为空。
用一个数组记录每个点初始状态下的入度。
在初始的时候将入度为0的点加入宽度搜索的队列中。
在宽搜的时候,对于当前点,将其出边对应的所有点的入度都减一,然后顺便判断一下入度是否变成了0,如果是,就将该点加入队尾。
总之就是说,不断删点删边,同时把符合条件的点入队,直到图为空。
出队的顺序就是拓扑排序之后所得的序列。
例题(一) 输出拓扑序
链接:poj2367
题意: 知道一个数n, 然后n行,编号1到n, 每行输入几个数,该行的编号排在这几个数前面,输出一种符合要求的编号名次排序。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int MAXN=100+10;
int ans[MAXN],in[MAXN];
bool vis[MAXN][MAXN];
int n,cnt;
queue<int>q;
void sort()
{
while(!q.empty())
{
int tp=q.front();