热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

判断给定图是否存在合法拓扑序列(拓扑排序及其优化)

数据结构实验之图论十:判断给定图是否存在合法拓扑序列


数据结构实验之图论十:判断给定图是否存在合法拓扑序列
Description
给定一个有向图,判断该有向图是否存在一个合法的拓扑序列。

Input
输入包含多组,每组格式如下。

第一行包含两个整数n,m,分别代表该有向图的顶点数和边数。(n<=10)

后面m行每行两个整数a b,表示从a到b有一条有向边。

Output
若给定有向图存在合法拓扑序列,则输出YES;否则输出NO。

Sample
Input
1 0
2 2
1 2
2 1
Output
YES
NO

每次找一个入度为0的节点,删除该节点,如果找不到,则说明不存在合法拓扑序列,有环存在。
我们可以通过队列来存在入度为零的节点,以此来优化

普通暴力找入度为0的节点代码:

#include
using namespace std;
int s[12];
int ma[12][12];
int vis[12];
int u, v, n, m, i, j, k;
int main()
{
ios::sync_with_stdio(false);
while (cin >> n >> m)
{
memset(s, 0, sizeof(s));
memset(ma, 0, sizeof(ma));
memset(vis, 0, sizeof(vis));
for (int i = 0; i < m; i++)
{
cin >> u >> v;
ma[u][v] = 1;
s[v]++;
}
for (k = 0; k < n; k++)
{
int flag = 1;
for (i = 1; i <= n; i++)
{
if (s[i] == 0 && vis[i] == 0)
{
vis[i] = 1;
flag = 0;
for (j = 1; j <= n; j++)
{
if (ma[i][j]) {
s[j]--;
}
}
break;
}
}
if (flag) break;
}
if (k < n)
cout << "NO\n";
else
cout << "YES\n";
}
}

利用队列代码:

#include
using namespace std;
int s[12];
int ma[12][12];
int u, v, n, m, i, k;
int main() {
ios::sync_with_stdio(false);
while (cin >> n >> m) {
memset(s, 0, sizeof(s));
memset(ma, 0, sizeof(ma));
queue<int> q;
k = 0;
for (int i = 0; i < m; i++) {
cin >> u >> v;
ma[u][v] = 1;
s[v]++;
}
for (int i = 1; i <= n; i++) {
if (!s[i]) q.push(i);
}
while (!q.empty()) {
int t = q.front();
q.pop();
k++;
for (i = 1; i <= n; i++) {
if (ma[u][i]) {
s[i]--;
if (!s[i]) q.push(i);
}
}
}
if (k == n)
cout << "YES\n";
else
cout << "NO\n";
}
}

链式前向星存图代码

#include
using namespace std;
int s[12];
int h[12];
int cnt;
struct node {
int v, next;
} a[12];
void add(int u, int v) {
a[++cnt].v = v;
a[cnt].next = h[u];
h[u] = cnt;
}
int u, v, n, m, i, k;
int main() {
ios::sync_with_stdio(false);
while (cin >> n >> m) {
cnt = 0;
memset(h, 0, sizeof(h));
memset(s, 0, sizeof(s));
queue<int> q;
k = 0;
for (int i = 0; i < m; i++) {
cin >> u >> v;
add(u, v);
s[v]++;
}
for (int i = 1; i <= n; i++) {
if (!s[i]) q.push(i);
}
while (!q.empty()) {
int t = q.front();
q.pop();
k++;
for (i = h[t]; i; i = a[i].next) {
s[a[i].v]--;
if (!s[a[i].v]) q.push(i);
}
}
if (k == n)
cout << "YES\n";
else
cout << "NO\n";
}
}


推荐阅读
  • 视觉Transformer综述
    本文综述了视觉Transformer在计算机视觉领域的应用,从原始Transformer出发,详细介绍了其在图像分类、目标检测和图像分割等任务中的最新进展。文章不仅涵盖了基础的Transformer架构,还深入探讨了各类增强版Transformer模型的设计思路和技术细节。 ... [详细]
  • 服务器虚拟化存储设计,完美规划储存与资源,部署高性能虚拟化桌面
    规划部署虚拟桌面环境前,必须先估算目前所使用实体桌面环境的工作负载与IOPS性能,并慎选储存设备。唯有谨慎估算贴近实际的IOPS性能,才能 ... [详细]
  • 深入解析 C++ 中的 String 和 Vector
    本文详细介绍了 C++ 编程语言中 String 和 Vector 的使用方法及特性,旨在帮助开发者更好地理解和应用这两个重要的容器。 ... [详细]
  • 本文详细介绍了在Luat OS中如何实现C与Lua的混合编程,包括在C环境中运行Lua脚本、封装可被Lua调用的C语言库,以及C与Lua之间的数据交互方法。 ... [详细]
  • 在1995年,Simon Plouffe 发现了一种特殊的求和方法来表示某些常数。两年后,Bailey 和 Borwein 在他们的论文中发表了这一发现,这种方法被命名为 Bailey-Borwein-Plouffe (BBP) 公式。该问题要求计算圆周率 π 的第 n 个十六进制数字。 ... [详细]
  • OBS Studio自动化实践:利用脚本批量生成录制场景
    本文探讨了如何利用OBS Studio进行高效录屏,并通过脚本实现场景的自动生成。适合对自动化办公感兴趣的读者。 ... [详细]
  • 本题要求计算一组正整数的最小公倍数(LCM)。输入包括多组测试数据,每组数据首先给出一个正整数n,随后是n个正整数。 ... [详细]
  • 流处理中的计数挑战与解决方案
    本文探讨了在流处理中进行计数的各种技术和挑战,并基于作者在2016年圣何塞举行的Hadoop World大会上的演讲进行了深入分析。文章不仅介绍了传统批处理和Lambda架构的局限性,还详细探讨了流处理架构的优势及其在现代大数据应用中的重要作用。 ... [详细]
  • c语言二元插值,二维线性插值c语言
    c语言二元插值,二维线性插值c语言 ... [详细]
  • 在Effective Java第三版中,建议在方法返回类型中优先考虑使用Collection而非Stream,以提高代码的灵活性和兼容性。 ... [详细]
  • 本文基于Java官方文档进行了适当修改,旨在介绍如何实现一个能够同时处理多个客户端请求的服务端程序。在前文中,我们探讨了单客户端访问的服务端实现,而本篇将深入讲解多客户端环境下的服务端设计与实现。 ... [详细]
  • 本文详细介绍了如何使用C#实现不同类型的系统服务账户(如Windows服务、计划任务和IIS应用池)的密码重置方法。 ... [详细]
  • 如何从BAM文件绘制ATAC-seq插入片段长度分布图?
    在ATAC-seq数据处理中,插入片段长度的分布图是一个重要的质量控制指标,它能反映出核小体的周期性排列。本文将详细介绍如何从BAM文件中提取并绘制这些数据。 ... [详细]
  • 本文探讨了如何通过Service Locator模式来简化和优化在B/S架构中的服务命名访问,特别是对于需要频繁访问的服务,如JNDI和XMLNS。该模式通过缓存机制减少了重复查找的成本,并提供了对多种服务的统一访问接口。 ... [详细]
  • 机器学习(ML)三之多层感知机
    深度学习主要关注多层模型,现在以多层感知机(multilayerperceptron,MLP)为例,介绍多层神经网络的概念。隐藏层多层感知机在单层神经网络的基础上引入了一到多个隐藏 ... [详细]
author-avatar
是非涩味_943
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有