【PTA数据结构 | C语言版】强连通分量

本专栏持续输出数据结构题目集,欢迎订阅。

文章目录

    • 题目
    • 代码

题目

本题请你编写程序,输出给定有向图中的各个强连通分量,并统计强连通分量的个数。

输入格式:
输入首先在第一行给出 2 个整数,依次为有向图的顶点数 n(0<n≤15)和边数 m。
随后 m 行,每行给出一条有向边的起点和终点编号。编号从 0 开始,其间以 1 个空格分隔。

输出格式:
按照 { v1 v2 … vk } 的格式,每行输出一个强连通分量中的所有顶点 v1~vk 的编号。最后一行输出强连通分量的个数。

输入样例:
4 5
0 1
1 3
3 0
2 1
2 3

输出样例:
{ 0 1 3 }
{ 2 }
2

注意:强连通分量的输出顺序是不唯一的,以任何顺序输出都可以,有特殊裁判程序判断输出的正确性。例如下列输出也是正确的。

{ 2 }
{ 1 3 0 }
2

代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define MAX_VERTEX 15typedef struct Node {int vertex;struct Node* next;
} Node;typedef struct {Node* adj[MAX_VERTEX];int n;
} Graph;// 栈结构用于DFS顺序记录
typedef struct {int data[MAX_VERTEX];int top;
} Stack;// 函数声明
void initGraph(Graph* g, int n);
void addEdge(Graph* g, int src, int dest);
Graph getTranspose(Graph* g);
void DFSUtil(Graph* g, int v, int visited[], Stack* stack);
void fillOrder(Graph* g, int visited[], Stack* stack);
void printSCCs(Graph* g);int main() {int n, m;scanf("%d %d", &n, &m);Graph g;initGraph(&g, n);for (int i = 0; i < m; i++) {int src, dest;scanf("%d %d", &src, &dest);addEdge(&g, src, dest);}printSCCs(&g);return 0;
}// 初始化图
void initGraph(Graph* g, int n) {g->n = n;for (int i = 0; i < n; i++) {g->adj[i] = NULL;}
}// 添加有向边
void addEdge(Graph* g, int src, int dest) {Node* newNode = (Node*)malloc(sizeof(Node));newNode->vertex = dest;newNode->next = g->adj[src];g->adj[src] = newNode;
}// 获取图的转置(所有边反向)
Graph getTranspose(Graph* g) {Graph transpose;initGraph(&transpose, g->n);for (int v = 0; v < g->n; v++) {Node* temp = g->adj[v];while (temp != NULL) {addEdge(&transpose, temp->vertex, v);temp = temp->next;}}return transpose;
}// 初始化栈
void initStack(Stack* s) {s->top = -1;
}// 入栈
void push(Stack* s, int v) {s->data[++(s->top)] = v;
}// 出栈
int pop(Stack* s) {return s->data[(s->top)--];
}// 判断栈是否为空
int isEmpty(Stack* s) {return s->top == -1;
}// 深度优先搜索辅助函数
void DFSUtil(Graph* g, int v, int visited[], Stack* stack) {visited[v] = 1;Node* temp = g->adj[v];while (temp != NULL) {int adjVertex = temp->vertex;if (!visited[adjVertex]) {DFSUtil(g, adjVertex, visited, stack);}temp = temp->next;}// 记录顶点完成时间(压栈)if (stack != NULL) {push(stack, v);} else {// 直接输出SCC成员(第二次DFS)printf("%d ", v);}
}// 填充顶点处理顺序(第一次DFS)
void fillOrder(Graph* g, int visited[], Stack* stack) {for (int i = 0; i < g->n; i++) {if (!visited[i]) {DFSUtil(g, i, visited, stack);}}
}// 打印所有强连通分量
void printSCCs(Graph* g) {Stack stack;initStack(&stack);int visited[MAX_VERTEX];memset(visited, 0, sizeof(visited));// 第一次DFS,记录顶点处理顺序fillOrder(g, visited, &stack);// 获取图的转置Graph transpose = getTranspose(g);// 重置访问标记memset(visited, 0, sizeof(visited));int count = 0; // 强连通分量计数器// 第二次DFS,处理转置图while (!isEmpty(&stack)) {int v = pop(&stack);if (!visited[v]) {printf("{ ");DFSUtil(&transpose, v, visited, NULL);printf("}\n");count++;}}printf("%d\n", count); // 输出强连通分量个数
}    

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

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

相关文章

idea部署新项目时,用自定义的maven出现的问题解决

出现这个问题是因为maven版本和idea版本不兼容&#xff0c;例如图示是maven3.9和idea2021.3的版本不兼容&#xff0c;maven换成3.8.x即可解决

OCR 身份识别:让身份信息录入场景更高效安全

在银行柜台开户、线上平台实名认证等场景中&#xff0c;身份信息录入是基础环节&#xff0c;OCR 身份识别产品正成为提升效率与安全性的关键。​传统人工录入身份证信息&#xff0c;不仅耗时久&#xff0c;还易因手误导致姓名、号码出错&#xff0c;影响业务办理进度。而 OCR 身…

Web 服务器和Web 中间件

一、什么是 Web 中间件 Web 中间件&#xff08;Web Middleware&#xff09;是运行在 Web 服务器与实际业务程序之间的一层“胶水”软件&#xff0c;用来统一处理公共事务&#xff0c;让开发者专注写业务逻辑。常见职责&#xff1a; 请求/响应拦截&#xff08;鉴权、日志、跨域、…

Paimon的部分更新以及DeleteVector实现

背景 本文基于 Paimon 0.9 出于对与Paimon内部的DeleteVctor的实现以及部分更新的实现进行的源码阅读。 关于 DeleteVector的介绍可以看这里 说明 对于Paimon来说无论是Spark中使用还是Flink使用&#xff0c;后面的逻辑都是一样的&#xff0c;所以我们以Spark为例来说。所以…

Redis 的事务机制是怎样的?

Redis 的事务机制 Redis支持事务机制,其主要目的是确保多个命令执行的原子性,即这些命令会作为一个不可分割的操作单元执行。 需要注意的是,Redis事务不支持回滚操作。从Redis 2.6.5版本开始,服务器会在命令累积阶段检测错误。在执行EXEC命令时,若发现错误则会拒绝执行事…

网安学习NO.17

1. VPN 概述定义&#xff1a;在公用网络&#xff08;如 Internet、帧中继、ATM 等&#xff09;中&#xff0c;通过技术手段虚拟出的一条企业内部专线&#xff0c;能像私有网络一样提供安全性、可靠性和可管理性。核心特征&#xff1a;利用公共网络构建&#xff0c;具备 “虚拟性…

MCU芯片AS32S601在卫星光纤放大器(EDFA)中的应用探索

摘要&#xff1a;本文聚焦于国科安芯推出的AS32S601型MCU芯片在卫星光纤放大器&#xff08;EDFA&#xff09;中的潜在应用&#xff0c;探讨其技术特性、抗辐射性能及适用性。通过分析其在单粒子效应脉冲激光试验中的表现&#xff0c;结合EDFA系统对控制芯片的要求&#xff0c;评…

Hexo - 免费搭建个人博客02 - 创建个人博客

导言我的博客&#xff1a;https://q164129345.github.io/ 开始一步一步地完成博客的创建。 一、初始化Hexo博客以上所示&#xff0c;运行以下指令在myCode文件夹里初始化一个hexo博客。 hexo init myblog二、安装依赖如上所示&#xff0c;完成依赖的安装。 cd myblog npm insta…

单片机-----基础知识整合

一、基础知识1&#xff09;单片机的组成&#xff1a;中央处理器CPU、随机存储器RAM、只读存储器ROM、定时器、多种I/O接口、中断系统等2&#xff09;STM32U575RIT6采用ARM Cortex-M33内核架构ARM是什么&#xff1f;①ARM是一家公司&#xff0c;ARM公司是一家芯片知识产权&#…

双流join 、 Paimon Partial Update 和 动态schema

背景 Paimon 通过其独特的 partial-update 合并引擎和底层的 LSM 存储结构&#xff0c;巧妙地将传统双流 Join 中对 Flink State 的高频随机读/写&#xff0c;转换为了对 Paimon 表的顺序写和后台的高效合并&#xff0c;从而一站式地解决了 Flink 作业状态过大、依赖外部 KV 系…

7.3.1 进程调度机制那些事儿

一&#xff1a;task_struct结构体分析 1、进程有两种特殊形式&#xff1a;没有用户虚拟地址空间的进程叫内核线程&#xff0c;共享用户虚拟地址空间的进程叫作用户线程。共享同一个用户虚拟地址空间的所有用户线程叫线程组。 C语言标准库进程 Linux内核进程 …

基于多种机器学习的水质污染及安全预测分析系统的设计与实现【随机森林、XGBoost、LightGBM、SMOTE、贝叶斯优化】

文章目录有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主项目介绍总结每文一语有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主 项目介绍 随着工业化和城市化的不断推进&#xff0c;水质污染问题逐渐成为影响生态环境…

Linux第三天Linux基础命令(二)

1.grep命令可以通过grep命令&#xff0c;从文件中通过关键字过滤文件行。grep [-n] 关键字 文件路径选项-n&#xff0c;可选&#xff0c;表示在结果中显示匹配的行的行号。参数&#xff0c;关键字&#xff0c;必填&#xff0c;表示过滤的关键字&#xff0c;带有空格或其它特殊符…

Linux Debian操作系统、Deepin深度操作系统手动分区方案参考

以下是Linux Debian操作系统、Deepin深度操作系统安装过程中手动分区的建议&#xff0c;按UEFI、swap、boot、根分区、home分区划分&#xff0c;以下是详细的分区配置参考建议&#xff1a; 一、手动分区方案&#xff08;UEFI模式&#xff09;分区名称分区类型大小建议挂载点文件…

jmeter如何做自动化接口测试?

全网最全流程&#xff01;JmeterAntAllureJenkins搭建属于你的接口自动化流水线&#xff0c;CI/CD直接起飞&#xff01;1.什么是jmeter&#xff1f; JMeter是100%完全由Java语言编写的&#xff0c;免费的开源软件&#xff0c;是非常优秀的性能测试和接口测试工具&#xff0c;支…

MyBatis整合SpringBoot终极指南

以下是一份系统化的 ​MyBatis 整合 Spring Boot 学习笔记&#xff0c;结合官方文档与最佳实践整理&#xff0c;涵盖配置、核心功能、实战示例及常见问题解决。 一、整合基础与依赖配置 1. ​核心依赖​ 在 pom.xml 中添加&#xff1a; <dependency><groupId>or…

企业微信ipad协议接口解决方案最新功能概览

支持最新版本企业微信&#xff0c;安全稳定0封号免费试用&#xff0c;技术支持&#xff1a;string wechat"Mrzhu0107"企微ipad协议接口最新功能升级如下&#xff1a;【初始化】初始化企业微信&#xff0c;设置消息回调地址&#xff0c;获取运行中的实例&#xff0c;根…

ansible 批量 scp 和 load 镜像

1、save 镜像脚本 在本地保存镜像到 ansible 代码目录的脚本。 1.1、使用说明: 保存单个镜像 save -i gcr.io/cadvisor/cadvisor:v0.52.1保存某个 namespace 下的所有镜像 save1.2、脚本内容 cat /usr/local/bin/save #!/bin/bash #set -e # 分隔符 str="-"# …

【C# in .NET】20. 探秘静态类:抽象与密封的结合体

探秘静态类:抽象与密封的结合体 一、静态类的底层本质:抽象与密封的结合体 静态类作为 C# 中特殊的类型形式,其底层实现融合了抽象类与密封类的特性,形成了不可实例化、不可继承的类型约束。 1. IL 层面的静态类标识 定义一个简单的静态类: public static class Stri…

【Vue3】ECharts图表案例

官方参考&#xff1a;Examples - Apache ECharts 1、创建工程 npm create vitelatest 或 npm init vuelatest 设置如下 2、下载依赖集运行项目 cd vue-echarts-demo npm install npm install echarts npm run dev 3、编写核心代码 创建src\components\BarView.vue文件…