「周记」拓扑排序

拓扑排序的英文名是 Topological sorting。
拓扑排序要解决的问题是给一个图的所有节点排序。
拓扑排序的目标是将所有节点排序,使得排在前面的节点不能依赖于排在后面的节点。 ——OI-WiKi

拓扑排序是在 DAG(有向无环图) 中每次选则入度为 0 的节点加入队列,并删除与这个节点相连的边,重复执行此操作。
这样做的作用是后面加入队列的节点一定不依赖于前面的节点,因此拓扑排序有无后效性,可以用于 dp
也可以用于判环,当队列为空时若还有边则该图有环。

例题 1:

思路很简单, d[] 用于存储最长距离, rd[] 用于存储入度。

第一遍代码:

#include
#include
#include

using namespace std;

const int N = 1505;

int n, m;
int u, v, w;
int t;
long long d[N];
bool f[N][N];
int g[N][N];
int rd[N];

queue  q;

int main(){

    scanf("%d%d", &n, &m);

    for(int i = 1; i

45 分,下了一组数据,发现有重边的情况。。。。
略改输入部分代码。

#include
#include
#include

using namespace std;

const int N = 1505;

int n, m;
int u, v, w;
int t;
long long d[N];
bool f[N][N];
int g[N][N];
int rd[N];

queue  q;

int main(){

    scanf("%d%d", &n, &m);

    for(int i = 1; i

然并卵,还是 WA。
原因是其他与目标路径无关的点没有入队,导致部分点最长路已经确定了,但入度不为 0,解决方法就是在 1 入队之前先把其他入度为 0 的点入队,A 之。

最终代码:

#include
#include
#include

using namespace std;

const int N = 1505;

int n, m;
int u, v, w;
int t;
long long d[N];
bool f[N][N];
int g[N][N];
int rd[N];

queue  q;

int main(){

    scanf("%d%d", &n, &m);

    for(int i = 1; i

其实可以跑 SPAF

例题 2:

类似板子题,一开始只需要将所有入度为 0 的点入队,没有奇怪数据。

代码:

#include
#include
#include
#include

using namespace std;

const int N = 1e5 + 10;

int n, m, x, y, t;
int rd[N], d[N];

vector  g[N];
queue  q;

int main(){

    scanf("%d%d", &n, &m);

    for(int i = 1; i

总结:

Original: https://www.cnblogs.com/cjwen6/p/15878687.html
Author: cjwen6
Title: 「周记」拓扑排序

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/712989/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球