acwing算法提高之图论--有向图的强连通分量

目录

  • 1 介绍
  • 2 训练

1 介绍

本博客介绍有向图的强连通分量的题目。

连通分量:是针对有向图的一个概念。对于分量中任意两个结点a、b,必然可以从a走到b,且从b走到a。
强连通分量:是针对有向图的一个概念。极大强连通分量,也就是说再加一个结点,它就不是连通分量。

强连通分量,用来将一个有向图转化为一个有向无环图(DAG、拓扑图)。方法是缩点,将所有连通分量缩成一个点。
有向无环图有很多好处,可以递推(即拓扑序)求最短路或最长路。

2 训练

题目1:1174受欢迎的牛

C++代码如下,

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>using namespace std;const int N = 10010, M = 50010;int n, m;
int h[N], e[M], ne[M], idx;
int dfn[N], low[N], timestamp;
int stk[N], top;
bool in_stk[N];
int id[N], scc_cnt, Size[N];
int dout[N];void add(int a, int b) {e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}void tarjan(int u) {dfn[u] = low[u] = ++ timestamp;stk[++top] = u, in_stk[u] = true;for (int i = h[u]; i != -1; i = ne[i]) {int j = e[i];if (!dfn[j]) {tarjan(j);low[u] = min(low[u], low[j]);} else if (in_stk[j]) {low[u] = min(low[u], dfn[j]);}}if (dfn[u] == low[u]) {++scc_cnt;int y;do {y = stk[top--];in_stk[y] = false;id[y] = scc_cnt;Size[scc_cnt] ++;} while (y != u);}
}int main() {scanf("%d%d", &n, &m);memset(h, -1, sizeof h);while (m--) {int a, b;scanf("%d%d", &a, &b);add(a, b);}for (int i = 1; i <= n; ++i) {if (!dfn[i]) {tarjan(i);}}for (int i = 1; i <= n; ++i) {for (int j = h[i]; ~j; j = ne[j]) {int k = e[j];int a = id[i], b = id[k];if (a != b) dout[a]++;}}int zeros = 0, sum = 0;for (int i = 1; i <= scc_cnt; ++i) {if (!dout[i]) {zeros++;sum += Size[i];if (zeros > 1) {sum = 0;break;}}}printf("%d\n", sum);return 0;
}

题目2:367学校网络

C++代码如下,

#include <cstring>
#include <iostream>
#include <algorithm>using namespace std;const int N = 110, M = 10010;int n;
int h[N], e[M], ne[M], idx;
int dfn[M], low[N], timestamp;
int stk[N], top;
bool in_stk[N];
int id[N], scc_cnt;
int din[N], dout[N];void add(int a, int b) {e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}void tarjan(int u) {dfn[u] = low[u] = ++ timestamp;stk[++top] = u, in_stk[u] = true;for (int i = h[u]; ~i; i = ne[i]) {int j = e[i];if (!dfn[j]) {tarjan(j);low[u] = min(low[u], low[j]);} else if (in_stk[j]) {low[u] = min(low[u], dfn[j]);}}if (dfn[u] == low[u]) {++scc_cnt;int y;do {y = stk[top--];in_stk[y] = false;id[y] = scc_cnt;}  while (y != u);}
}int main() {cin >> n;memset(h, -1, sizeof h);for (int i = 1; i <= n; ++i) {int t;while (cin >> t, t) add(i, t);}for (int i = 1; i <= n; ++i) {if (!dfn[i]) {tarjan(i);}}for (int i = 1; i <= n; ++i) {for (int j = h[i]; j != -1; j = ne[j]) {int k = e[j];int a = id[i], b = id[k];if (a != b) {dout[a]++;din[b]++;}}}int a = 0, b = 0;for (int i = 1; i <= scc_cnt; ++i) {if (!din[i]) a++;if (!dout[i]) b++;}printf("%d\n", a);if (scc_cnt == 1) puts("0");else printf("%d\n", max(a, b));return 0;
}

题目3:1175最大半连通子图

C++代码如下,

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <unordered_set>using namespace std;typedef long long LL;const int N = 100010, M = 2000010;
int n, m, mod;
int h[N], hs[N], e[M], ne[M], idx;
int dfn[N], low[N], timestamp;
int stk[N], top;
bool in_stk[N];
int id[N], scc_cnt, scc_size[N];
int f[N], g[N];void add(int h[], int a, int b) {e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}void tarjan(int u) {dfn[u] = low[u] = ++ timestamp;stk[++top] = u, in_stk[u] = true;for (int i = h[u]; ~i; i = ne[i]) {int j = e[i];if (!dfn[j]) {tarjan(j);low[u] = min(low[u], low[j]);} else if (in_stk[j]) {low[u] = min(low[u], dfn[j]);} }if (dfn[u] == low[u]) {++scc_cnt;int y;do {y = stk[top--];in_stk[y] = false;id[y] = scc_cnt;scc_size[scc_cnt]++;} while (y != u);}
}int main() {memset(h, -1, sizeof h);memset(hs, -1, sizeof hs);scanf("%d%d%d", &n, &m, &mod);while (m--) {int a, b;scanf("%d%d", &a, &b);add(h, a, b);}for (int i = 1; i <= n; ++i) {if (!dfn[i]) {tarjan(i);}}unordered_set<LL> S;for (int i = 1; i <= n; ++i) {for (int j = h[i]; ~j; j = ne[j]) {int k = e[j];int a = id[i], b = id[k];LL hash = a * 1000000ll + b;if (a != b && !S.count(hash)) {add(hs, a, b);S.insert(hash);}}}for (int i = scc_cnt; i; i--) {if (!f[i]) {f[i] = scc_size[i];g[i] = 1;}for (int j = hs[i]; ~j; j = ne[j]) {int k = e[j];if (f[k] < f[i] + scc_size[k]) {f[k] = f[i] + scc_size[k];g[k] = g[i];} else if (f[k] == f[i] + scc_size[k]) {g[k] = (g[k] + g[i]) % mod;}}}int maxf = 0, sum = 0;for (int i = 1; i <= scc_cnt; ++i) {if (f[i] > maxf) {maxf = f[i];sum = g[i];} else if (f[i] == maxf) sum = (sum + g[i]) % mod;}printf("%d\n", maxf);printf("%d\n", sum);return 0;
}

题目4:368银河

C++代码如下,


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/748.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构】单链表的头节点与尾节点

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;数据结构 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

玄子Share-计算机网络参考模型

玄子Share-计算机网络参考模型 分层思想 利用七层参考模型&#xff0c;便于在网络通信过程中&#xff0c;快速的分析问题&#xff0c;定位问题并解决问题 将复杂的流程分解为几个功能相对单一的子过程 整个流程更加清晰&#xff0c;复杂问题简单化 更容易发现问题并针对性的…

【Java开发指南 | 第十七篇】Java 方法

读者可订阅专栏&#xff1a;Java开发指南 |【CSDN秋说】 文章目录 简介语法实例构造方法 简介 Java中的方法是用来执行特定任务的一组语句&#xff0c;可以重复使用。它们包含在类或对象中&#xff0c;并通过调用来执行。 举个例子&#xff0c;println() 是一个方法&#xff…

动态内存管理 柔性数组

文章目录 动态内存函数 malloc freecallocrealloc 重新开辟空间realloc 也可以第一个参数为NULL&#xff0c;则是直接开辟内存&#xff0c;类似于malloc用法 常见的动态内存错误对空指针进行解引用操作对开辟的内存越界访问对非动态开辟的内存使用free释放使用free释放动态开辟…

vue2 在循环里,给字体加上随机颜色并加上随机图标且少重复

在循环里&#xff0c;给字体加上随机颜色并加上随机图标且少重复 <template><div class"pbfb5"><el-row :gutter"32"><el-col :xs"6" :sm"6" :lg"6" style"margin-bottom:32px;" v-for&quo…

(四)相关性分析 学习简要笔记 #统计学 #CDA学习打卡

目录 一. 相关性分析简介 二. 相关性分析方法 1&#xff09;连续型变量vs连续型变量&#xff1a;Pearson/Spearman &#xff08;a&#xff09;Pearson &#xff08;b&#xff09;Spearman等级相关系数 2&#xff09;二分类变量&#xff08;自然&#xff09;vs连续型变量&…

macos知名的清理软件 cleanmymac和腾讯柠檬哪个好 cleanmymacx有必要买吗

MacOS是一款优秀的操作系统&#xff0c;但是随着使用时间的增加&#xff0c;它也会产生一些不必要的垃圾文件&#xff0c;占用磁盘空间和内存资源&#xff0c;影响系统的性能和稳定性。为了保持MacOS的清洁和高效&#xff0c;我们需要使用一些专业的清理软件来定期扫描和清除这…

CentOS服务器安装宝塔(图文详解)

宝塔的操作其实就是类似于把linux的指令使用方式&#xff0c;通过宝塔这个第三方工具进行可视化展示&#xff0c;但其实&#xff0c;他还是在操作linux&#xff0c;只是不需要你去记那么多的指令&#xff0c;宝塔把大多数的工具都集成到自己里面&#xff0c;这样你就可以在宝塔…

信号量Semaphore

什么是信号量&#xff1f; C中的信号量&#xff08;Semaphore&#xff09;是一种同步对象&#xff0c;用于控制对共享资源的访问&#xff0c;以防止多个线程或进程同时访问同一资源&#xff0c;从而避免数据不一致的问题。信号量通过维护一个计数值来实现这一功能&#xff0c;…

【Golang】Gin教学-获取请求信息并返回

安装Gin初始化Gin处理所有HTTP请求获取请求的URL和Method获取请求参数根据Content-Type判断请求数据类型处理JSON数据处理表单数据处理文件返回JSON响应启动服务完整代码测试 Gin是一个用Go&#xff08;又称Golang&#xff09;编写的HTTP Web框架&#xff0c;它具有高性能和简洁…

Event loop(Message loop)

事件循环&#xff08;消息循环&#xff09; 浏览器的进程模型 进程 程序运行需要有它自己专属的内存空间&#xff0c;可以把这块内存空间简单的理解为进程 每个应用至少有一个进程&#xff0c;进程之间相互独立&#xff0c;即使要通信&#xff0c;也需要双方同意。 线程 …

Java并发体系--atomic--字段类

atomic--字段类 Atomic字段类是一种原子操作类&#xff0c;用于实现多线程环境下对共享变量的原子操作。它可以确保在并发情况下&#xff0c;对共享变量的操作是原子性的&#xff0c;不会出现线程安全问题。 Atomic字段类提供了一些方法&#xff0c;比如get()和set()方法用…

【Linux学习】Linux权限(二)

文章目录 &#x1f680;Linux权限管理&#x1f680;修改文件的所有者&#x1f680;修改文件或目录的所属组&#x1f680;同时修改为念的拥有者与所属组&#x1f680;文件类型&#x1f680;file指令&#x1f680;目录权限&#x1f680;umask指令&#x1f680;粘滞位 &#x1f68…

Ubuntu22.04.4 - Redis - 笔记

一、安装 sudo apt update sudo apt install redis-serverrootzheng:/etc# redis-cli --version redis-cli 6.0.16二、配置文件修改 配置文件地址 /etc/redis/redis.conf 1、开启远程访问 # 注释掉绑定地址#bind 127.0.0.1&#xff0c;让Redis可远程访问 # bind 127.0.0.1 …

论系统的安全架构的三个论点写一篇论文

撰写一篇围绕系统的安全架构三个论点的论文能够提供深刻的见解关于如何构建一个既安全又可靠的系统。接下来&#xff0c;我们将详细探讨这三个论点&#xff0c;并提供一个论文大纲来指导你如何组织和展开你的论述。 论文大纲 1. 引言 简要介绍系统安全架构的重要性&#xff…

Linux 内核的汇编级别的系统调用

2024年4月19日&#xff0c;周五下午 Linux 内核支持多种汇编级别的系统调用&#xff0c;这些系统调用通常以软中断&#xff08;soft interrupt&#xff09;的方式实现。 这里列举了一些常见的汇编级别的系统调用&#xff1a; x86 架构下的 int 0x80 调用&#xff1a;在 x86 架…

网盘——私聊

在私聊这个功能实现中&#xff0c;具体步骤如下&#xff1a; 1、实现步骤&#xff1a; A、客户端A发送私聊信息请求&#xff08;发送的信息包括双方的用户名&#xff0c;聊天信息&#xff09; B、如果双方在线则直接转发给B&#xff0c;不在线则回复私聊失败&#xff0c;对方…

TLV262x系列单电源运算放大器

这份文件是德州仪器&#xff08;Texas Instruments&#xff09;关于TLV262x系列单电源运算放大器的数据手册。以下是该文件的核心内容概要&#xff1a; 产品系列描述&#xff1a; TLV262x系列是德州仪器&#xff08;Texas Instruments&#xff09;推出的一系列低功耗、宽带宽的…

Sping源码(七)—ConfigurationClassPostProcessor创建流程

序言 前两篇文章介绍了invokeBeanFactoryPostProcessors的执行流程&#xff0c;和自定义实现BeanDefinitionRegistryPostProcessor类的方式方法。 这篇文章会主要介绍Spring启动加载xml时&#xff0c;ConfigurationClassPostProcessor类是如何加载到Spring中&#xff0c;并且…

VScode 里面使用 python 去直接调用 CUDA

上一个 帖子主要分享了如何 去将 C 程序 打包成一个package。 我们最后的 目的实际上是想把 CUDA 的程序 打包成 一个 Package &#xff0c; C 程序只是起到了桥梁的作用&#xff1a; 首先&#xff1a;CUDA 程序 和 C 的程序一样&#xff0c; 都有一个 .cu 的源文件和 一个 .…