热门标签 | 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";
}
}


推荐阅读
  • golang常用库:配置文件解析库/管理工具viper使用
    golang常用库:配置文件解析库管理工具-viper使用-一、viper简介viper配置管理解析库,是由大神SteveFrancia开发,他在google领导着golang的 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文基于刘洪波老师的《英文词根词缀精讲》,深入探讨了多个重要词根词缀的起源及其相关词汇,帮助读者更好地理解和记忆英语单词。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 微软Exchange服务器遭遇2022年版“千年虫”漏洞
    微软Exchange服务器在新年伊始遭遇了一个类似于‘千年虫’的日期处理漏洞,导致邮件传输受阻。该问题主要影响配置了FIP-FS恶意软件引擎的Exchange 2016和2019版本。 ... [详细]
  • 作者:守望者1028链接:https:www.nowcoder.comdiscuss55353来源:牛客网面试高频题:校招过程中参考过牛客诸位大佬的面经,但是具体哪一块是参考谁的我 ... [详细]
  • 深入解析TCP/IP五层协议
    本文详细介绍了TCP/IP五层协议模型,包括物理层、数据链路层、网络层、传输层和应用层。每层的功能及其相互关系将被逐一解释,帮助读者理解互联网通信的原理。此外,还特别讨论了UDP和TCP协议的特点以及三次握手、四次挥手的过程。 ... [详细]
  • 深入解析Android自定义View面试题
    本文探讨了Android Launcher开发中自定义View的重要性,并通过一道经典的面试题,帮助开发者更好地理解自定义View的实现细节。文章不仅涵盖了基础知识,还提供了实际操作建议。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文详细探讨了Java中的24种设计模式及其应用,并介绍了七大面向对象设计原则。通过创建型、结构型和行为型模式的分类,帮助开发者更好地理解和应用这些模式,提升代码质量和可维护性。 ... [详细]
  • 在前两篇文章中,我们探讨了 ControllerDescriptor 和 ActionDescriptor 这两个描述对象,分别对应控制器和操作方法。本文将基于 MVC3 源码进一步分析 ParameterDescriptor,即用于描述 Action 方法参数的对象,并详细介绍其工作原理。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • Android 渐变圆环加载控件实现
    本文介绍了如何在 Android 中创建一个自定义的渐变圆环加载控件,该控件已在多个知名应用中使用。我们将详细探讨其工作原理和实现方法。 ... [详细]
  • 探讨如何真正掌握Java EE,包括所需技能、工具和实践经验。资深软件教学总监李刚分享了对毕业生简历中常见问题的看法,并提供了详尽的标准。 ... [详细]
  • FinOps 与 Serverless 的结合:破解云成本难题
    本文探讨了如何通过 FinOps 实践优化 Serverless 应用的成本管理,提出了首个 Serverless 函数总成本估计模型,并分享了多种有效的成本优化策略。 ... [详细]
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社区 版权所有